C++ переформатирование файлов прервано до достижения конца
Я новичок здесь! Хотя этот код завершил вывод большей части файла, он прервался непосредственно перед тем, как закончил, что пошло не так? (2VI3 - огромный файл данных для координат).
Может ли кто-нибудь порекомендовать лучшие способы написания этого кода?
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
string *array = new string[2000];
ifstream iFile("2VI3_SA.txt");
if (!iFile.is_open()) {
cerr << "error: file cannot be opened" << endl;
abort();
}
int x = 0;
while (!iFile.eof()) {
getline(iFile, array[x]);
cout << array[x] << endl;
x++;
}
iFile.close();
cout << x << endl;
ofstream oFile("something.txt");
if (!oFile.is_open()) {
cerr << "error: file cannot be opened" << endl;
abort();
}
for (int i = 0; i < 2000; i++) {
if (i < 818) {
oFile << array[i] << "\n";
}
else if (i<1317){
oFile << array[i].substr(0, 8) << i - 378 << array[i].substr(11, 68) << '\n';
//renumbering all lines below the change
}
else {
oFile << array[i];
}
}
oFile.close();
delete[] array;
return 0;
}
1 ответ
Я вижу по крайней мере три проблемы с кодом:
1.
while (!iFile.eof())
Такой подход к чтению файла всегда неверен.
2.
Массив из 2000 строк выделяется. Нет явной проверки фактического количества строк, прочитанных из входных файлов. Заявлено, что файл очень большой. Весьма вероятно, что в файле содержится более 2000 строк, что приведет к повреждению кучи и неопределенному поведению.
3.
Более подробный анализ логики кода показывает, что чтение всего файла в буфер памяти вообще не нужно! Вполне достаточно прочитать входной файл по одной строке за раз, а затем записать соответствующую выходную строку или строки в выходной файл и просто отследить номер строки, читаемой в данный момент. Целиком array
могут быть полностью устранены. Это не нужно.