У меня CSV файл выглядит так:
1;name;2;5;
2;diff_name;3;5;
И я хотел бы иметь возможность заменить 5 на 2 перед прочтением следующей строки. Поэтому я читаю файл:
file>>number1;
file.ignore( numeric_limits < streamsize >::max(), ';' );
file>>data;
и так далее. И я пытался написать так:
long pos = plik.tellp();
plik.seekp (pos-2);
plik<<other_number;
Но он разбивает файл. Я не знаю, как, но это ненадежно. pos как-то зависит от длины файла, и я не могу заставить его работать каждый раз (с разными значениями в файле) таким образом. Есть ли другой способ заменить значение здесь? Есть ли простой способ?
Как сказал Joachim Pileborg в комментарии, вы не можете (и просто) прямо заменить его в файле. Решением является запись в другом файле. Если ваш первый файл достаточно мал, вы можете использовать свою память вместо второго файла и записать результат в первый файл.
Мой код:
#include <fstream>
#include <iostream>
using namespace std;
int main(){
ifstream ifile("file.csv"); //First file
ofstream ofile("filenew.csv"); //File with replaced fields
char s[100];
string temp;//useful for the replacement
int count=0;//fields counter (useful for replacement)
while(ifile.good()){
ifile.getline(s, 100, ';'); //We read the file field by field
count++;
if(ifile.good()){
if(count==3){ //The third field is stored in a temp variable
temp = s;
}
else if(count==4){//And we put the fourth field before the third
ofile << s;
ofile << ';';
ofile << temp;
ofile << ';';
count=0;
}
else{
if(count==5)count=0;
ofile << s;
ofile << ';';
}
}
}
}