2016-06-11 7 views
0

В настоящее время я получаю себя в fileusage в C. Я нашел код, объясняющий чтение строк из файла. Однако мне действительно интересно, как это механически работает.filePointer автоматически прогрессирует во время цикла?

while (!feof(fPointer)){ 
fgets(singleLine, 150, fPointer); 
puts(singleLine); 
} 

Как файл-указатель знает в конце цикла, чтобы перейти к следующей строке? Должен ли файл-указатель увеличиваться в конце цикла while?

Приветствия

+0

Вам нужно знать больше о поиске файлов и перемещении указателя. Функция 'fgets' фактически перемещает указатель файла на следующую строку после чтения определенного количества символов. В вашем случае '150' –

+0

это не' feof() 'in' while'? – Cherubim

+0

да простите за опечатку, я ее отредактирую. так что в основном команда fgets автоматически увеличивает файл-указатель? –

ответ

4

FILE объект хранит информацию об открытом файле, в том числе «текущий positition». Каждая операция чтения/записи увеличивает текущую позицию на то, сколько байтов было прочитано/записано. Вот почему вы можете просто позвонить в fgets (или любую другую функцию ввода) в цикле и получить содержимое, кусок куска.

Аналогичным образом вы можете просто вызвать printf (или любую другую функцию вывода) несколько раз, чтобы произвести вывод, и они не будут перезаписывать друг друга.

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

(Ваш fPointer просто указывает на один FILE объект Вы не должны увеличивать этот указатель,. Это будет просто указать на оперативную память.)

Наконец, while (!feof(fp)) неправильно, потому что feof запрашивает «конец файла» бит, хранящийся в объекте FILE. Он не предсказывает, не закончится ли следующее чтение из-за достижения конца файла. Бит «конец файла» установлен в значение true только после того, как функция ввода достигает конца файла. Этот тип цикла будет запускаться еще раз после завершения файла, а затем обрабатывать данные об мусоре (или устаревших, с предыдущей итерации).