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

実現したいこと

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|
このようにしたいです。
ここにより詳細な情報を記載してください。

コメントを投稿

0 コメント