2010-09-03 4 views
0

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

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

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

+4

Почему бы не использовать 'std :: string' для этого? – Archie

ответ

6

following некоторые из доступных вариантов:

istream& getline (istream& is, string& str, char delim); 
istream& getline (istream& is, string& str); 
+0

по-прежнему та же проблема. – Ahmed

+1

@Ahmed: в чем проблема? – Chubsdad

+0

is и str будет иметь фиксированный размер, и я хочу решение, которое перераспределяется в соответствии с размером ввода. – Ahmed

2

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

0

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

^.+$ 

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

+0

Хорошо, я полагаю, вы это сделаете. Но звучит как массовый перебор, учитывая, что решение находится в стандартной библиотеке. –

0

Посмотрите на memory-mapped files в boost :: iostreams.

+0

Карты памяти вам не помогут. Вам все равно нужно знать размер файла для сопоставления. –

0

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

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

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