HS_C_Student Ответов: 3

C: проблемы при разборе файла в виде потока строк


Довольно часто я использую fgets() в цикле для перебора строк файла и их обработки. Обычно это работает хорошо, но в некоторых случаях это отстой.

Пример 1: Если вам нужно знать информацию о следующей строке(строках) или предыдущей строке(строках), чтобы решить, как обрабатывать текущую строку.

Пример 2: текущая строка указывает на то, что вы прочитали слишком далеко, и вы должны отправить ее в другой контекст вашего синтаксического анализатора.

Я знаю много обходных путей, но в целом они, как правило, являются несостоятельными хаками.

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

Я думаю, что это лучшее решение, но оно имеет серьезный недостаток: потребление памяти, эквивалентное размеру файла. Насколько я знаю, fopen() и fgets() этого не делают.

Что вы думаете о наилучшем компромиссе? Создать файловый интерфейс ввода-вывода с небольшим кэшем?

Спасибо

Что я уже пробовал:

Хранение двух или трех строк одновременно и использование ссылок для их обработки в виде набора

Использование функции un-gets-line для выталкивания строк обратно в стек, если они были прочитаны и должны быть непрочитаны, рисование новых строк из стека до тех пор, пока он не закончится, а затем извлечение новых.

3 Ответов

Рейтинг:
1

Mohibur Rashid

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

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


Rick York

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

Mohibur Rashid

Игнорировать \r count only \n

Rick York

Если читать каждый символ, то это может сработать.

Рейтинг:
1

KarstenK

Когда это работа приложения, чтобы разобрать полный файл, это не должно быть проблемой. Проверить его.

В лучшем случае вы используете некоторые стандартные контейнеры, такие как int this пример кода для чтения файла.


Рейтинг:
1

CPallini

Цитата:
Пример 1: Если вам нужно знать информацию о следующей строке(строках) или предыдущей строке(строках), чтобы решить, как обрабатывать текущую строку.

Пример 2: текущая строка указывает на то, что вы прочитали слишком далеко, и вы должны отправить ее в другой контекст вашего синтаксического анализатора.

Обе эти проблемы обычно решаются в синтаксических анализаторах с использованием механизма look-ahead (см., например Парсинг - Википедия[^] ), что, если я не ошибаюсь, вы уже находите себе в качестве возможного решения
Цитата:
Хранение двух или трех строк одновременно и использование ссылок для их обработки в виде набора