Как получить всю строку, используя fgets

0

Мне нужно прочитать данные из РАЗЛИЧНЫХ потоков (не только из stdin). Я обнаружил функцию fgets, нормально читать некоторое ограниченное число символов, но мне нужно получить целую строку, например, получить, но я должен указать поток ввода. Помогите решить эту проблему.

  • 3
    Если вы уверены, что ваши строки имеют максимальный размер, тогда используйте fgets с массивом символов такого размера (или, возможно, вдвое большего размера). Если вам вообще не нужны какие-либо ограничения, вам все равно нужно выбрать максимальный размер для массива, который вы используете с fgets а затем использовать malloc/realloc для динамического выделения и увеличения результирующего массива, который вы копируете из буферов, полученных из fgets . Если строка , возвращаемая fgets не содержит символ новой строки , то либо лишь частично линия была прочитана или последняя строка в файле была прочитана и не содержит символ новой строки.
  • 1
    В качестве альтернативы, если вам разрешено использовать нестандартные функции, вы можете использовать getline .
Показать ещё 2 комментария
Теги:
string
stdin

2 ответа

0

Обычная процедура для чтения целого файла:

  • Открыть файл
  • Ищите его конец
  • Прочитать позицию
  • Создать буфер такого размера
  • Ищите начало
  • Чтение в буфер
  • Закройте файл

Пример на этом сайте делает именно это: http://www.cplusplus.com/reference/cstdio/fread/

Если вы хотите прочитать до специального символа, тогда просто запустите fgets в цикле, где вы используете realloc для изменения размера вашего буфера. Обычный способ заключается в том, чтобы увеличить размер буфера не на фиксированную сумму каждый раз, а скорее на увеличивающееся значение, например удвоение его размера на каждой итерации цикла. Таким образом, вы будете выполнять максимум вызовов журнала (n) realloc.

  • 2
    Хотя это подходит для небольших файлов, эта «обычная процедура» неэффективна для чтения файлов журнала размером в гигабайты, для которых строковый подход имеет больше смысла. Я считаю, что это должно быть упомянуто здесь.
  • 0
    Этот ответ состоит в том, чтобы прочитать «весь файл», но вопрос ОП «получить целую строку»
0

Надеюсь, я понял... вам нужно искать конец файла (EOF), который устанавливается, когда (угадайте, что?) Встречается конец файла.

Что касается размера буфера, вы можете сначала проверить размер потока, чтобы выделить достаточное количество памяти для принимающего буфера.

Использование перераспределения обычно не является хорошим выбором. Он медленный и только показывает, что вы не ожидали необходимости в памяти. Если не нужны абсолютно необходимые (действительно жесткие ограничения памяти), лучше выделять больше, чем нужно, чем перераспределять. И, конечно, ничто не сравнится с "правильным" распределением.

  • 0
    Этот ответ заключается в том, чтобы «искать конец файла (EOF)», но вопрос OP «получить целую строку»
  • 0
    Вы правы, я думаю, что это все еще может быть полезным. Чтобы сэкономить на операциях чтения на жестком диске, лучше прочитать весь файл, а затем разбить файл на массивы указателей на строки. Согласитесь, это должен быть файл, который помещается в сегодняшнюю память компьютеров + 4Go = D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню