Мне нужно прочитать данные из РАЗЛИЧНЫХ потоков (не только из stdin). Я обнаружил функцию fgets, нормально читать некоторое ограниченное число символов, но мне нужно получить целую строку, например, получить, но я должен указать поток ввода. Помогите решить эту проблему.
Обычная процедура для чтения целого файла:
Пример на этом сайте делает именно это: http://www.cplusplus.com/reference/cstdio/fread/
Если вы хотите прочитать до специального символа, тогда просто запустите fgets в цикле, где вы используете realloc для изменения размера вашего буфера. Обычный способ заключается в том, чтобы увеличить размер буфера не на фиксированную сумму каждый раз, а скорее на увеличивающееся значение, например удвоение его размера на каждой итерации цикла. Таким образом, вы будете выполнять максимум вызовов журнала (n) realloc.
Надеюсь, я понял... вам нужно искать конец файла (EOF), который устанавливается, когда (угадайте, что?) Встречается конец файла.
Что касается размера буфера, вы можете сначала проверить размер потока, чтобы выделить достаточное количество памяти для принимающего буфера.
Использование перераспределения обычно не является хорошим выбором. Он медленный и только показывает, что вы не ожидали необходимости в памяти. Если не нужны абсолютно необходимые (действительно жесткие ограничения памяти), лучше выделять больше, чем нужно, чем перераспределять. И, конечно, ничто не сравнится с "правильным" распределением.
fgets
с массивом символов такого размера (или, возможно, вдвое большего размера). Если вам вообще не нужны какие-либо ограничения, вам все равно нужно выбрать максимальный размер для массива, который вы используете сfgets
а затем использоватьmalloc/realloc
для динамического выделения и увеличения результирующего массива, который вы копируете из буферов, полученных изfgets
. Если строка , возвращаемаяfgets
не содержит символ новой строки , то либо лишь частично линия была прочитана или последняя строка в файле была прочитана и не содержит символ новой строки.