чтение из файла определенных строк за раз в c / c ++ - PullRequest
1 голос
/ 18 декабря 2009

Итак, у меня есть графический интерфейс, разработанный с использованием QT, C ++. У меня есть большой объем данных в текстовом файле, который я хотел бы прочитать следующим образом:

загрузка первых 50 строк, когда пользователь прокручивает вниз загрузку следующих 50 строк и т. Д. Когда пользователь прокручивает вверх, загружает предыдущие 50 строк.

Спасибо.

Ответы [ 3 ]

1 голос
/ 18 декабря 2009

Самым простым решением было бы загрузить файл в память и манипулировать им оттуда:

std::vector<std::string>    lines;

std::string  line;
while(std::getline(file,line)
{
    lines.push_back(line);
}

Если файл слишком большой.
Затем вам нужно создать индекс файла, который точно скажет, где начинается каждая строка.

std::vector<std::streampos>    index;
index.push_back(file.tellg());

std::string  line;
while(std::getline(file,line)
{
    index.push_back(file.tellg());
}
file.setg(0);
file.clear();  // Resets the EOF flag.

Как только у вас будет свой индекс. Вы можете прыгать по файлу и читать любую конкретную строку.

int jumpTo = 50;
file.seekg(index[jumpTo]); // Jump to line 50.
//
// Read 50 lines. Do not read past the end
// This will set the EOF flag and future reads will fail.
for(int loop=0;loop < 50 && ((jumpTo + loop) < index.size());++loop)
{
    std::string line;
    std::getline(file,line);
}
1 голос
/ 18 декабря 2009

Подключите ваше приложение к sliderMoved или sliderReleased сигналов вашего QSlider и прочитайте 50 строк, которые вы хотите отобразить. Или используйте событие valueChange .

0 голосов
/ 18 декабря 2009

Я предполагаю, что этот файл может быть огромным (скажем, в диапазоне гигабайт).

Предполагая, что переносимость не является проблемой, вы можете использовать карту памяти, отображаемую в io.Во многих системах Unix у вас есть команда mmap .

Хороший учебник можно найти здесь .

Если вам нужно сделать это для систем Windows, можно найти эквивалентный пример для Windows здесь .

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

Единственный сложный бит будет делить блоки файлов на строки.

...