разобрать строку неизвестного размера - PullRequest
0 голосов
/ 03 сентября 2010

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

ifstream inp_file;
char line[1000] ;
inp_file.getline(line, 1000);

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

Ответы [ 5 ]

6 голосов
/ 03 сентября 2010

следующие - некоторые из доступных опций:

istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );
2 голосов
/ 03 сентября 2010

Одной из обычных идиом для чтения входных данных неизвестного размера является чтение фрагмента известного размера внутри цикла, проверка наличия большего количества входных данных (т. Е. Проверка того, что вы находитесь не в конце строки / файла / области интерес), и расширить размер вашего буфера. Хотя примитивы getline вам могут подойти, это очень общая схема для многих задач в языках, где выделение памяти оставлено на усмотрение программиста.

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

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

  1. Установите последний символ в буфере на '\0'
  2. Вызов fgets()
  3. Проверкапоследний символ и посмотрите, является ли он по-прежнему '\0'
    • Если это не '\0' и не '\n', подразумевается, что еще не закончил чтение строки.Выделите новый буфер и скопируйте данные в этот новый буфер и вернитесь к шагу (1) выше.
    • Если уже есть выделенный буфер, вызовите realloc(), чтобы увеличить его.В противном случае, вы сделали.Верните данные в выделенный буфер.

Это был совет, данный в моей лекции по алгоритмам.

0 голосов
/ 03 сентября 2010

Посмотрите на отображенные в память файлы в boost :: iostreams.

0 голосов
/ 03 сентября 2010

Может быть, вы могли бы взглянуть на использование re2c , который является гибким сканером для анализа входного потока? Таким образом, вы можете вводить строку любого размера без необходимости заранее знать ... например, используя регулярное выражение

^.+$

после захвата re2c вы можете определить, сколько памяти выделить ...

...