Как использовать feof и ferror для fgets (мини-оболочка в C)

Я написал эту мини-оболочку, но я не уверен, что правильно контролирую ошибки. Я знаю, что fgets может возвращать feof и ferror ( http://www.manpagez.com/man/3/fgets/), но я не знаю, как их использовать.

Я проверил, возвращает ли fgets нулевой указатель (который указывает, что содержимое буфера равнозначно), но я хотел бы знать, как использовать feof и ferror.

    #include <stdio.h>
    #include <stdlib.h> 
    #include <string.h> 
    #include <stdbool.h>    
    #define LINE_LEN  50
    #define MAX_PARTS  50 
    int main ()
    {
    char* token;
    char str[LINE_LEN];
    char* arr[MAX_PARTS];
    int i,j;
    bool go_on = true;

    while (go_on == true){
        printf("Write a line:('quit' to end) \n $:");
        fgets(str, LINE_LEN, stdin);

        if (str==NULL) {
            goto errorfgets;
        } else {
            size_t l=strlen(str);
            if(l && str[l-1]=='\n')
                str[l-1]=0;

            i=0;
            /* split string into words*/
            token = strtok(str, " \t\r\n");
            while( token != NULL ) 
            {
                arr[i] = token;
                i++;
                token = strtok(NULL," \t\r\n");
            }

            fflush(stdin);

            /* check if the first word is quit*/
            if (strcmp(arr[0],"quit")==0)
            {
                printf("Goodbye\n");
                go_on = false;
            } else {

                for (j=0; j < i; j++){
                printf("'%s'\n", arr[j]);       
                }   
            }
        }
    }

    return 0;
    errorfgets:
        printf("fgets didn't work correctly");
        return -1;
}

3 ответа

Решение

Прежде всего, ваш тест:

fgets(str, LINE_LEN, stdin);

[...]

if (str==NULL) {
    goto errorfgets;
}

неправильно. str параметр передается по значению и не может быть изменен fgets(), Вместо этого вы должны проверять значение, возвращаемое fgets() (возвраты NULL на EOF или ошибка).

Относительно вашего конкретного вопроса: fgets() не "возвращается" feof или же ferror, И то и другое feof() а также ferror() на самом деле функции (см. справочные страницы). Вы бы использовали это следующим образом:

if (!fgets(str, LINE_LEN, stdin)) {
    /* fgets returns NULL on EOF and error; let's see what happened */
    if (ferror(stdin)) {
        /* handle error */
    } else {
        /* handle EOF */
    }
}
fgets(str, LINE_LEN, stdin);

if (str==NULL) {
    goto errorfgets;
}

Это не так, как вы проверяете возвращаемое значение fgets, Более того, в вашем коде str никогда не будет NULL по определению. Вы хотите что-то вроде:

if (!fgets(....)) }
    /* error handling. */
}

Вы можете использовать Feof, как это.

#open a file
fd = fopen (testFile,"r+b");

#read some data from file 
fread (&buff, 1, 1, fd);
..
..
..
#To check if you are at the end of file
if (feof (fd))
{
    printf("This is end of file");
}else{
    printf("File doesn't end. Do continue...");
}
Другие вопросы по тегам