Читать большой текстовый файл в C ++ - PullRequest
1 голос
/ 21 октября 2011

Я хотел бы прочитать файл объемом около 5 МБ в памяти ... файл имеет этот формат (это текстовый файл)

ID 3:  0 itemId.1 0 itemId.2 0 itemId.5 1 itemId.7 ........................ 20 itemId.500
ID 50:  0 itemId.31 0 itemId.2 0 itemId.4 2 itemId.70 ........................ 20 itemId.2120
.....

как я могу сделать это эффективно в c ++?

Ответы [ 3 ]

5 голосов
/ 21 октября 2011

Чтение файла построчно:

ifstream fin ("file.txt");
string     myStr;

while(getline(fin, myStr))   // Always put the read in the while condition.
{                            // Then you only enter the loop if there is data to
    //use myStr data         // processes. Otherwise you need to read and then
}                            //  test if the read was OK
                             //
                             // Note: The last line read will read up to (but not
                             //        past) then end of file. Thus When there is
                             //        no data left in the file its state is still
                             //        OK. It is not until you try and explicitly
                             //        read past the end of file that EOF flag is set.

По причинам, не вызывающим вызов close, см .:
https://codereview.stackexchange.com/questions/540/my-c-code-involving-an-fstream-failed-review/544#544

Если эффективность - ваша главная цель (вероятно, нет). Затем прочитайте весь файл в память и проанализируйте оттуда: см. Томас ниже: Прочитайте большой текстовый файл в c ++

4 голосов
/ 21 октября 2011

Считать весь файл в память, затем обработать содержимое в памяти.

Файловый ресурс (например, жесткий диск) наиболее эффективен, когда двигатель продолжает вращаться.Таким образом, одно большое чтение данных более эффективно, чем 5 операций чтения небольших объемов данных.

На большинстве платформ доступ к памяти быстрее, чем к файлу.Используя эту информацию, можно сделать программу более эффективной, считывая данные в память, а затем обрабатывая ее.

Сочетание двух методов приведет к повышению производительности: считывание большого количества данных за одну транзакцию в память и обработка памяти.

Некоторые люди объявляют большие массивы char или unsigned char (для двоичных данных).Другие люди говорят std :: string или std :: vector зарезервировать большой объем памяти, а затем считывают данные в структуру данных.

Кроме того, чтение блока (a.ka. istream::read()) будет обходить большинство медленных частей средств потока C ++.

3 голосов
/ 21 октября 2011

Использование файлового потока :

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    string line;
    ifstream myfile ("example.txt");
    if (myfile.is_open())
    {
        while ( getline(myfile, line) )
            cout << line << endl;

        myfile.close();
    }
    else 
    {
        cout << "Unable to open file"; 
    }

    return 0;
}

5 МБ действительно не большой файл.Поток позаботится о том, чтобы вы читали куски за раз, но на самом деле;почти любая машина, на которой он работает, может без проблем прочитать 5 МБ памяти прямо в память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...