Como usar o EOF para executar um arquivo de texto em C?

Eu tenho um arquivo de texto que tem seqüências de caracteres em cada linha. Eu quero incrementar um número para cada linha no arquivo de texto, mas quando chega ao final do arquivo, obviamente, precisa parar. Eu tentei fazer algumas pesquisas sobre o EOF, mas não consegui entender como usá-lo corretamente.

Estou assumindo que preciso de um loop while, mas não tenho certeza de como fazer isso.

    Como você detecta o EOF depende do que você está usando para ler o stream:

    function result on EOF or error -------- ---------------------- fgets() NULL fscanf() number of succesful conversions less than expected fgetc() EOF fread() number of elements read less than expected 

    Verifique o resultado da chamada de input para a condição apropriada acima e, em seguida, chame feof() para determinar se o resultado ocorreu devido a EOF ou outro erro.

    Usando fgets() :

      char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof buffer, stream) != NULL) { // process buffer } if (feof(stream)) { // hit end of file } else { // some other error interrupted the read } 

    Usando fscanf() :

     char buffer[BUFFER_SIZE]; while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion { // process buffer } if (feof(stream)) { // hit end of file } else { // some other error interrupted the read } 

    Usando fgetc() :

     int c; while ((c = fgetc(stream)) != EOF) { // process c } if (feof(stream)) { // hit end of file } else { // some other error interrupted the read } 

    Usando fread() :

     char buffer[BUFFER_SIZE]; while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1 // element of size // BUFFER_SIZE { // process buffer } if (feof(stream)) { // hit end of file } else { // some other error interrupted read } 

    Observe que o formulário é o mesmo para todos eles: verifique o resultado da operação de leitura; se falhar, verifique o EOF. Você verá muitos exemplos como:

     while(!feof(stream)) { fscanf(stream, "%s", buffer); ... } 

    Este formulário não funciona da maneira que as pessoas pensam, porque feof() não retornará verdadeiro até que você tenha tentado ler após o final do arquivo. Como resultado, o loop executa uma vez a mais, o que pode ou não causar algum sofrimento.

    Um possível loop C seria:

     #include  int main() { int c; while ((c = getchar()) != EOF) { /* ** Do something with c, such as check against '\n' ** and increment a line counter. */ } } 

    Por enquanto, eu ignoraria funções feof e similares. A experiência mostra que é muito fácil chamá-la na hora errada e processar algo duas vezes na crença de que ainda não foi atingido.

    Armadilha para evitar: usando char para o tipo de c. getchar retorna o próximo caractere convertido para um unsigned char e, em seguida, para um int . Isso significa que na maioria das plataformas [sane] o valor de EOF e os valores de ” char ” válidos em c não se sobrepõem, portanto você nunca irá acidentalmente detectar EOF para um caractere “normal”.

    Você deve verificar o EOF depois de ler o arquivo.

     fscanf_s // read from file while(condition) // check EOF { fscanf_s // read from file }