Читать большие файлы на С++, а также небольшие файлы на С++?

Я хочу сделать программу на C++ для чтения огромных файлов (например, по 50 ГБ каждый), в то время как у вас всего 4 или 8 ГБ ОЗУ. Я хочу, чтобы этот алгоритм был быстрее и работал с небольшими файлами.

Это код, который у меня есть до сих пор:

      #include<iostream>
#include<fstream>
#include<string>

using namespace std;
//Making a buffer to store the chuncks of the file read:
// Buffer size 1 Megabyte (or any number you like)
size_t buffer_size = 1<<20;
char *buffer = new char[buffer_size];



int main(){
string filename="stats.txt";

//compute file size
size_t iFileSize = 0;
std::ifstream ifstr(filename.c_str(), std::ios::binary); // create the file stream    - this is scoped for destruction

if(!ifstr.good()){
    cout<<"File is not valid!"<<endl;
    exit(EXIT_FAILURE);
}
//get the file size
iFileSize = ifstr.tellg();
ifstr.seekg( 0, std::ios::end ); // open file at the end to get the size
iFileSize = (int) ifstr.tellg() - iFileSize;
cout<<"File size is: "<<iFileSize<<endl;
//close the file and reopen it for reading:
ifstr.close();
cout<<"Buffer size before check is:"<<buffer_size<<endl;
if(buffer_size>iFileSize){
        buffer_size=iFileSize;
}
cout<<"Buffer size after check is:"<<buffer_size<<endl;


ifstream myFile;

myFile.open(filename);

if(myFile.fail()){
        cerr<<"Error opening file!"<<endl;
        exit(EXIT_FAILURE);

}

if(!myFile.good()){
        cout<<"File is not valid!"<<endl;
        exit(EXIT_FAILURE);

}

if(!myFile.is_open()){
        cout<<"File is NOT opened anymore!"<<endl;
        return 1;
}

while(myFile.is_open()&&myFile){
    // Try to read next chunk of data
    myFile.read(buffer, buffer_size);
    // Get the number of bytes actually read
    size_t count = myFile.gcount();
     // If nothing has been read, break
    if (!count){
        break;
    }
    // Do whatever you need with first count bytes in the buffer:
    string line;
    while(getline(myFile, line)){
             if(!line.empty()){
                cout <<"Line: '" << line << "'" <<endl;
             }


    }

}
delete[] buffer;
buffer = NULL;
myFile.close();


return 0;

}

В моих файлах между текстовой строкой могут быть пустые строки, даже первые строки могут быть пустыми. Итак, я протестировал программу на небольшом файле (размером 128 КБ), чтобы увидеть, как она работает. Но это не работает. Он не отображает ни одной строки на экране, даже если файл такой маленький.

Что случилось? Кроме того, если я изменю размер буфера на очень маленькое число, он прочитает только первые одну или две строки, но почему он не переходит в конец файла, чтобы прочитать и отобразить все строки из этого маленького файла? Любая помощь, пожалуйста?

Заранее спасибо!

Это тестовый файл: (Он также начинается с нескольких пустых строк.)

      Population UK: 97876876723


Population France: 898989













This is the test end of the file: Yay!

Вот результат: И ни одна строка из файла не отображается.

0 ответов

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