2013-12-11 1 views
0

Допустим, у меня есть файл, содержащий строку длиной 10:C - fgets() - Что, если строка длиннее?

ABCDEFGHIJ

И читать мой текст файла строка за строкой, используя fgets() с буфером размером 4 я должен позвонить fgets() в чтобы убедиться, что вся строка прочитана. Но, скажем, первый звонок, он будет читать первые 3 символа (buffer size -1) справа? Будет ли он также добавлять нулевой завершающий символ в последней позиции моего 4-символьного буфера, даже если реальный конец моей строки не был достигнут или заполнит его четырьмя символами и не будет содержать нулевых символов в конце моего буфера? что сделало бы звонок strlen() невозможным?

Спасибо :)

+3

Лучший способ узнать, с простым вопросом, как это - попробовать его;) – EoiFirst

+0

Нет лучшего способа написать его в стандартной библиотечной документации. – Virus721

+2

Поскольку вы не нашли его в документации, напишите 3 строки кода, и вы будете знать вместо того, чтобы ждать ответа здесь. – EoiFirst

ответ

1

Глядя на человек странице fgets вы можете увидеть:.

«Символ новой строки, если таковой имеется, сохраняется Если какие-либо символы считываются и нет ошибки, `\ 0' символ добавляется в конец строки»

(http://www.manpagez.com/man/3/fgets/)

+0

Благодарим за помощь. – Virus721

1

От C стандартного проекта (2010) n1547.pdf, 7.21.7.2.2:

Функция fgets считывает не более, чем число символов, указанных n из потока, на который указывает поток, в массив, на который указывает s. Никакие дополнительные символы не читаются после символа новой строки (который сохраняется) или после окончания файла. Символ нуль записывается сразу после последнего символа, зачитываемого в массив .

5

Это в документации.

дословный из man fgets (курсива мной):

fgets() читает не более чем в один меньше символов размера из потока и сохраняют их в буфер, на который указует с. Чтение останавливается после a EOF или символ новой строки. Если считывается новая строка, она сохраняется в буфере . Конечный нулевой байт ('\ 0') сохраняется после последнего символа в буфере.


стенографические из 11 человека странице HP-UX (курсив мной):

fgets()

считывает символы из потока в массив, адресуемый к по s, пока не будут прочитаны n-1 символы, символ новой строки будет считан и перенесен в s или будет обнаружено состояние файла конца . Строка затем завершена нулевым символом.


Из POSIX specs:

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


Последнее не менее важно from MSDN:

Функция fgets считывает строку из входного потока аргумент и сохраняет его на ул. fgets считывает символы из текущей позиции потока до и включает первый символ новой строки, до конца потока или до тех пор, пока количество прочитанных символов не будет равно n - 1, в зависимости от того, что наступит раньше. Результат, сохраненный в str, добавляется с нулевым символом. Символ новой строки, если он читается, включен в строку.

+0

Есть другие вещи, кроме Linux в мире, который вы знаете ... – Virus721

+0

@ Virus721 Хорошо, если неуверенный возврат к стандарту C, как показано в ответе * user694733 *, также может помочь. – alk