Чтение строк в c с помощью windows.h - PullRequest
3 голосов
/ 12 марта 2011

Мне нужно использовать системные вызовы windows.h, чтобы прочитать файл, который я получаю из командной строки.Я могу прочитать весь файл в буфер, используя ReadFile(), а затем обрезать буфер в первом \0, но как мне прочитать только одну строку?Также мне нужно прочитать последнюю строку файла. Возможно ли это без чтения всего файла в буфер, потому что, возможно, файл имеет размер 4 ГБ или более, поэтому я не смогу его прочитать.Так кто-нибудь знает, как читать по строкам?

Ответы [ 3 ]

1 голос
/ 12 марта 2011

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

ReadFile считывает количество байтов и обрезает буфер в первом концестрока (\ n)

Используйте LZSeek для позиционирования в конце файла, затем переместитесь назад на строку байтов и найдите конец строки, начните там и прочитайте остаток строки.

1 голос
/ 12 марта 2011

Не «обрезать буфер при первом \ 0», ReadFile не возвращает строку с нулевым символом в конце.Он читает сырые байты.Вы должны обратить внимание на значение, возвращаемое через аргумент lpNumberOfBytesRead.Оно будет равно значению nNumberOfBytesToRead, которое вы передадите, пока не достигнете конца файла.

Теперь вы знаете, сколько допустимых байтов в буфере.Найдите в них первый байт '\ r' или '\ n', чтобы найти терминатор строки.Скопируйте диапазон байтов в строковый буфер, предоставленный вызывающей стороной, и верните.В следующий раз, когда вы прочитаете строку, начните с того места, где вы остановились ранее, после конца строки.Если вы не нашли терминатор строки, вам нужно скопировать байты в буфер и снова вызвать ReadFile (), чтобы прочитать больше байтов.Это делает код немного сложным, чтобы получить право, отличное упражнение в противном случае.

0 голосов
/ 12 марта 2011

ReadFile особенно плохой выбор для того, что вы хотите сделать. Вам разрешено использовать fgets? Это было бы гораздо проще использовать в вашем случае.

...