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 могут быть полностью устранены. Это не нужно.

Другие вопросы по тегам