質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.42%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

599閲覧

ファイルを読み込み追加データの書き込み消去

shiba_1006

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/04/25 06:36

編集2023/04/25 07:13

実現したいこと

csvファイルを読み込みそのあとcmd等で新しいデータを入力し保存し、既存のデータとともに出力、もし同じ番号を入力した場合は、削除する。また、0が入力されたら終了

前提

c++でファイルを読み込み、データの追加、削除を行うプログラムを作っています。
データの追加がうまくできません。
ofstream file("○○.csv", ios::app);
で書き込み位置を最後にしています
私のやりたいこととしては、1行ずつ読み込み、vというベクタにNOならNOの場所にnameならNAME の場所に格納してその後出力したいです。
csvファイルの一行目は
NO,氏名,フリガナ,入社日,誕生日
です。

出力するときには、|を利用と最大文字幅に固定してあります。

お忙しいところ恐縮ですがアドバイスよろしくお願いいたします

発生している問題・エラーメッセージ

visualstudioを利用していて、ビルドを行うとよくわからないエラーが出ます。Debug Assertion Failed!とでます。

該当のソースコード

c++

1#include <fstream> 2#include <iostream> 3#include <iomanip> 4//#include <cstring> 5#include <sstream> 6#include <string> 7#include <vector> 8using namespace std; 9 10class StaffInfo 11{ 12private: 13 14 string NO; 15 string NAME; 16 string KANA; 17 string FWORK; 18 string BIRTH; 19 20public: 21 22 void setLine(string str); 23 24 string getNO() { return NO; } 25 string getNAME() { return NAME; } 26 string getKANA() { return KANA; } 27 string getFWORK() { return FWORK; } 28 string getBIRTH() { return BIRTH; } 29 30 size_t getnoW() { return NO.size(); } 31 size_t getnameW() { return NAME.size(); } 32 size_t getkanaW() { return KANA.size(); } 33 size_t getfworkW() { return FWORK.size(); } 34 size_t getbirthW() { return BIRTH.size(); } 35}; 36 37//1行ずつ読みだし、sからNO,NAME,KANA,FWORKの代入。 番号=NO、氏名=NAME…。カンマ区切りなので0ならNOに1なら氏名に格納 38void StaffInfo::setLine(string str) { 39 std::stringstream ss(str); 40 string s; 41 for (int i = 0; getline(ss, s, ','); i++) { 42 43 if (i == 0) { 44 NO = s; 45 } 46 else if (i == 1) { 47 NAME = s; 48 } 49 else if (i == 2) { 50 KANA = s; 51 } 52 else if (i == 3) { 53 FWORK = s; 54 } 55 else if (i == 4) { 56 BIRTH = s; 57 } 58 } 59} 60 61int main(int argc, char* argv[]) { 62 63 if (argc != 2) { 64 cout << "パラメータ数が違います。" << endl; 65 return 1; 66 } 67 ofstream fout(argv[1]); 68 if (!fout) { 69 cout << "ファイルをオープンできませんでした。" << endl; 70 return 1; 71 } 72 73 int i; 74 75 vector<StaffInfo> v; //StaffInfo型の変数(オブジェクト)v。 76 ifstream fin(argv[1]); 77 for (i = 0; !fin.eof(); i++) { 78 string strline; 79 if (getline(fin, strline)) { 80 StaffInfo a; 81 a.setLine(strline); 82 v.push_back(a); 83 84 } 85 } 86 87 88 ofstream file("StaffInfoTable.csv", ios::app); 89 90 string input; 91 92 while (true) { 93 if (input == "0") { 94 break; 95 } 96 else { 97 98 99 100 cout << v[0].getNO() << ":"; 101 cin >> input; 102 string strline; 103 if (getline(cin, input)) { 104 StaffInfo a; 105 a.setLine(strline); 106 v.push_back(a); 107 } 108 109 cout << v[0].getNAME() << ":"; 110 cin >> input; 111 112 if (getline(cin, input)) { 113 StaffInfo a; 114 a.setLine(strline); 115 v.push_back(a); 116 } 117 118 cout << v[0].getKANA() << ":"; 119 cin >> input; 120 121 if (getline(cin, input)) { 122 StaffInfo a; 123 a.setLine(strline); 124 v.push_back(a); 125 } 126 127 cout << v[0].getFWORK() << ":"; 128 cin >> input; 129 130 if (getline(cin, input)) { 131 StaffInfo a; 132 a.setLine(strline); 133 v.push_back(a); 134 } 135 136 cout << v[0].getBIRTH() << ":"; 137 cin >> input; 138 139 if (getline(cin, input)) { 140 StaffInfo a; 141 a.setLine(strline); 142 v.push_back(a); 143 } 144 145 file << input << endl; 146 } 147 } 148 149 size_t* pt1; 150 pt1 = new size_t[v.size()]; 151 size_t* pt2; 152 pt2 = new size_t[v.size()]; 153 size_t* pt3; 154 pt3 = new size_t[v.size()]; 155 size_t* pt4; 156 pt4 = new size_t[v.size()]; 157 size_t* pt5; 158 pt5 = new size_t[v.size()]; 159 160 pt1[0] = 0; 161 pt2[0] = 0; 162 pt3[0] = 0; 163 pt4[0] = 0; 164 pt5[0] = 0; 165 166 167 for (i = 0; i < v.size(); i++) { 168 169 pt1[i] = v[i].getnoW(); 170 if (v[0].getnoW() != 0 && pt1[0] < pt1[i]) { 171 pt1[0] = pt1[i]; 172 } 173 pt2[i] = v[i].getnameW(); 174 if (v[0].getnameW() != 0 && pt2[0] < pt2[i]) { 175 pt2[0] = pt2[i]; 176 } 177 pt3[i] = v[i].getkanaW(); 178 if (v[0].getkanaW() != 0 && pt3[0] < pt3[i]) { 179 pt3[0] = pt3[i]; 180 } 181 pt4[i] = v[i].getfworkW(); 182 if (v[0].getfworkW() != 0 && pt4[0] < pt4[i]) { 183 pt4[0] = pt4[i]; 184 } 185 pt5[i] = v[i].getbirthW(); 186 if (v[0].getbirthW() != 0 && pt5[0] < pt5[i]) { 187 pt5[0] = pt5[i]; 188 } 189 } 190 191 cout.setf(ios::left, ios::adjustfield); 192 193 for (i = 0; i < v.size(); i++) { 194 if (v[i].getnoW() != 0 || v[0].getnoW() != 0) { 195 cout << "|" << setw(pt1[0]) << v[i].getNO(); 196 } 197 if (v[i].getnameW() != 0 || v[0].getnameW() != 0) { 198 cout << "|" << setw(pt2[0]) << v[i].getNAME(); 199 } 200 if (v[i].getkanaW() != 0 || v[0].getkanaW() != 0) { 201 cout << "|" << setw(pt3[0]) << v[i].getKANA(); 202 } 203 if (v[i].getfworkW() != 0 || v[0].getfworkW() != 0) { 204 cout << "|" << setw(pt4[0]) << v[i].getFWORK(); 205 } 206 if (v[i].getbirthW() != 0 || v[0].getbirthW() != 0) { 207 cout << "|" << setw(pt5[0]) << v[i].getBIRTH(); 208 } 209 cout << "|" << endl; 210 } 211 cout.unsetf(ios::left); 212 213 delete[] pt1; 214 delete[] pt2; 215 delete[] pt3; 216 delete[] pt4; 217 delete[] pt5; 218 219 vector<StaffInfo>().swap(v); 220 221 fin.close(); 222 fout.close(); 223 224 return 0; 225}

試したこと

インターネットで追加のコードの書き方を調べました。
最初68行目を!finにしていましたが書きこむという認識だったので!foutに変更しました。そうするとcsvの中身がすべて消えていました。

補足情報(FW/ツールのバージョンなど)

cmdにて

|NO |氏名 |フリガナ |入社日 |誕生日 |
|413|山田 太郎|ヤマダ タロウ |2023/4/1|2000/2/2|
|414|山田 次郎|ヤマダ ジロウ |2023/4/1|20001/1 |
|415|山田 三郎|ヤマダ サブロウ|2023/4/1|2000/1/2|
|416|山田 四郎|ヤマダ シロウ |2023/4/2|2000/1/3|

NO:111
氏名:山田 五郎

|NO |氏名 |フリガナ |入社日 |誕生日 |
|413|山田 太郎|ヤマダ タロウ |2023/4/1|2000/2/2|
|414|山田 次郎|ヤマダ ジロウ |2023/4/1|20001/1 |
|415|山田 三郎|ヤマダ サブロウ|2023/4/1|2000/1/2|
|416|山田 四郎|ヤマダ シロウ |2023/4/2|2000/1/3|
|111|山田 五郎|ヤマダ ゴロウ |2023/4/2|2000/1/4|
このようにしたいです。
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2023/04/25 07:00

> ビルドを行うとよくわからないエラーが出ます。Debug Assertion Failed! エラーメッセージは超重要情報なので、あいまいにしないで完全に理解するか全文を質問文に含めて助力を求めてください。 ざっとコードを見るかぎり、argv[1] に指定したファイルがいきなり空っぽになって v に何も入らないように思いました。
shiba_1006

2023/04/25 07:08

エクスプローラから見てみました。そしてらファイルがすべて空になっていました。なぜなのでしょうか。よくわからないです
int32_t

2023/04/25 07:17

そりゃ、対象ファイルを空っぽにするコードが入ってますからね…。 理解できないコードをコピペするとたいへん危険なのでやめましょう。
shiba_1006

2023/04/25 07:33

ofstream fout(argv[1]); のことでしょうか。 ofstream file (~.csv ios::app)の部分のことでしょうか。 コピペはしていません。書き足すプログラムだと思って書いています。
guest

回答1

0

ベストアンサー

c++

1 ofstream fout(argv[1]);

この行で argv[1] を書き込みモードで開いているので、ファイルは空っぽになります。その後の読み込みで何も読めないので、v も空で v[0] のアクセスは不正となります。
とりあえず fout のあたりのコードは不要なので削除したほうがいいでしょう。

投稿2023/04/25 07:26

int32_t

総合スコア21267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiba_1006

2023/04/25 07:42

消去したら、ファイルの中身が消されることはなくなりました。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問