2013-07-23 1 views
0

Я видел этот код где-то:Перемещает ли fscanf указатель переданного файла вперед?

#include<stdio.h> 

int main() 
{ 
    FILE * fp; 
    char s[1024]; 
    fp = fopen("file","r"); 

    while(fscanf(fp, "%s", s) != EOF) 
    { 
     puts(s); 
    } 

    return 0; 
} 

Я ожидал, что это будет держать на печать первого слова файла в бесконечном цикле. Я считал, что указатель файла принимается за вход только для того, чтобы получить точку, откуда должен быть прочитан вход, и fscanf будет иметь локальный указатель файла, который он будет использовать для чтения файла.

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

Я видел man documentation из fscanf, но не смог найти ничего о перемещении указателя файла после прочтения.

Может кто-нибудь объяснить или указать источник, где указано, что переданный указатель файла действительно перемещается после прочтения?

+1

Я бы предложил удалить тег C++, поскольку ничего здесь не является частью библиотеки C++ или, во всяком случае, является идиоматическим языком C++. – Borgleader

+0

@ Борлидер Ах, отлично. Удалили. –

+0

Указатель файла используется для указания позиции чтения/записи в файле.Поэтому он явно движется, когда вы читаете содержимое файла :) –

ответ

1

Из документации: «Читает данные из потока ...», это означает, что он будет действовать как другой поток, который вы читаете. (http://www.cplusplus.com/reference/cstdio/fscanf/)

Если вы идете к определению файла (FILE - перейти к определению), вы получите в этом ЬурейеЕ

#ifndef _FILE_DEFINED 
struct _iobuf { 
     char *_ptr; 
     int _cnt; 
     char *_base; 
     int _flag; 
     int _file; 
     int _charbuf; 
     int _bufsiz; 
     char *_tmpfname; 
     }; 
typedef struct _iobuf FILE; 
#define _FILE_DEFINED 
#endif 

, где вы можете увидеть sevral указатель (_Образы базовой & _ptr), что будет означать, что FILE сохраняет указатели как на начало файла (для поиска, как и для любого другого потока), так и для текущего местоположения.

1

ftell возвращает текущую позицию файла для потока и -1 при ошибке.

while(fscanf(fp, "%s", s) != EOF) 
{ 

    printf("%s>%ld\n", s, ftell(fp)); 
} 

fscanf возвращает количество элементов конвертированы и назначены. Он возвращает EOF при ошибке.

0

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

Это утверждение:

while(fscanf(fp, "%s", s) != EOF) 

испытания достигнут ли конец файла или нет.

У вас есть возможность ввести бесконечный цикл, если формат входного файла не соответствует ожидаемому.

 Смежные вопросы

  • Нет связанных вопросов^_^