hnwの日記

feof関数でwhileループを回す奴はド素人


2013-04-07 01:30@nonakapid:s-tomo
2013-04-07 10:002
2017-04-23
 


stackoverflowwhile( !feof( file ) ) is always wrongWilliam PursellCwhile( !feof( file ) )

PHPPHPPHPCPHP使

while( !feof( file ) )は常に悪い


 while( !feof(f)) 

1

使100%


/* 警告: ダメなコードのデモ */

#include <stdio.h>
#include <stdlib.h>

FILE *Fopen( const char *path, const char *mode );
int
main( int argc, char **argv )
{
    FILE *in;
    unsigned count;

    in = argc > 1 ? Fopen( argv[ 1 ], "r" ) : stdin;
    count = 0;

    /* 警告: これはバグ */
    while( !feof(in)) {  /* ここがダメ! */
        (void) fgetc(in);
        count++;
    }
    printf( "Number of characters read: %u\n", count );
    return EXIT_SUCCESS;
}

FILE *
Fopen( const char *path, const char *mode )
{
    FILE *f = fopen( path, mode );
    if( f == NULL ) {
        perror( path );
        exit( EXIT_FAILURE );
    }
    return f;
}

1
$ ./a.out < /dev/null
Number of characters read: 1

feof()falsefgetc()EOFcountfeof()true

feof()truefeof()調fread()0feofferror使fgetcEOFfeof()fread0fgetcEOF*1feof()false

feof()fread()fscanf()fgetc()

fgetc()EOFfeof()falsewhile(!feof(p))使ferror()while(!feof(p) && !ferror(p))

while(!feof(f))

補足


EOF

William Pursell
    while (1) {
        int c;
        c = fgetc(in);
 if (c == EOF) {
            if (!feof(in)) {
                // エラー表示
            }
            break;
        }
        count++;
    }

feof()使break
    int c;
    while ((c = fgetc(in)) != EOF) {
        count++;
    }

補足その2


whilefgetc()

whilefgetc()
    int c;
    c = fgetc(in);
    while (!feof(in)) { /* 警告:リードエラーの対策がありません */
        count++; /* 通常であれば、ここでもっと意味のある処理をするはず */
        c = fgetc(in);
    }

ferror()
    int c;
    c = fgetc(in);
    while (!feof(in) && !ferror(in)) {
        count++; /* 通常であれば、ここでもっと意味のある処理をするはず */
        c = fgetc(in);
    }



使

feof()使

*1:訳注:fgets()など、他の関数についても同様です