Как прочитать последние 10 строк текстового файла, используя CStdioFile - PullRequest
3 голосов
/ 12 сентября 2011

Я хотел бы прочитать последние 10 строк большого текстового файла. Обычно я перебираю файл и получаю последние 10 строк. Пожалуйста, скажите мне, есть ли другие способы, чтобы прочитать последние строки быстрее.

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

Вы можете получить длину файла в байтах с помощью (CStdioFile::GetLength) (унаследовано от CFile):

http://msdn.microsoft.com/en-US/library/b569d0t4(v=VS.80).aspx

И вы можете использовать CStdioFile::Seek, чтобы перейти кпроизвольное смещение:

http://msdn.microsoft.com/en-US/library/8c5ccz0x(v=VS.80).aspx

Если длина строки фиксирована, прочитать последние N строк довольно легко.Но здесь нет операции «чтение в обратном направлении», и в общем случае вы не знаете, какой длины строки в произвольном текстовом файле.(Вы можете создать и поддерживать индексный файл, который отслеживал бы его, если бы вы хотели сделать это быстрее.)

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

Таким образом, вам, вероятно, лучше выбрать размер буфера и выполнить чтение фрагментов.В качестве убедительного указания на то, что это полезно, см. Некоторый исходный код для UNIX под названием tail.Он получает последние N строк файла, и хотя он написан на C, он может дать вам некоторое представление:

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c#n477

0 голосов
/ 12 сентября 2011

В двоичных файлах у вас (обычно) фиксированная длина записи.В текстовых файлах одна возможность состоит в том, чтобы рассматривать текстовую строку как запись, в которой вы разделяете содержимое файла.К сожалению, строки не имеют фиксированного размера в обычных текстовых файлах, поэтому вы не можете полагаться на формулу, такую ​​как:

lastTenthLine = ( LengthOfFile / LengthOfLine ) - 10;

Единственный способ, о котором я могу думать, это переместить указатель чтения в конецфайл.Начните читать задом наперед, по одному символу каждый раз, и посчитайте, сколько раз вы проходите над символом '\ n'.После того, как вы посчитали десять раз, вы можете вернуть следующую позицию символа.

(Обратите внимание, что у вас могут возникнуть «проблемы с конечной строкой» в зависимости от происхождения (ОС) файлов, которые вы используете в качестве примераПоскольку вы используете MFC, у вас не возникнет никаких проблем, если используемые файлы были сгенерированы в Windows)

Поскольку я предполагаю, что это домашняя работа, я не буду публиковать код.У вас есть документация по MFC, объясняющая, как обращаться с файлами.Вам нужны методы CFile::Read и CFile::Seek (кроме Open и Close).Обратите внимание, что CFile является родительским классом CStdioClass.

http://msdn.microsoft.com/en-us/library/ey6xh9bk(v=vs.80).aspx

Надеюсь, это поможет.

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