How to use feof and ferror for fgets (minishell in C)

岁酱吖の 提交于 2020-01-11 12:45:13

问题


I've written this minishell but I'm not sure I'm making a correct control of the errors. I know fgets can return feof and ferror (http://www.manpagez.com/man/3/fgets/) but I don't know how to use them.

I've checked if fgets returns a null pointer (which indicates the content of the buffer is inditerminate) but i would like to know how to use feof and 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;
}

回答1:


First of all, your test:

fgets(str, LINE_LEN, stdin);

[...]

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

is wrong. The str parameter is passed by value and cannot be modified by fgets(). Instead, you should be checking the value returned by fgets() (returns NULL on EOF or error).

Regarding your specific question: fgets() does not "return" feof or ferror. Both feof() and ferror() are actually functions (see the man pages). You would use this as follows:

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 */
    }
}



回答2:


fgets(str, LINE_LEN, stdin);

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

That's not how you check the return value of fgets. What's more, in your code str will never be NULL by definition. You want something like:

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



回答3:


You can use feof like this.

#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...");
}


来源:https://stackoverflow.com/questions/21724004/how-to-use-feof-and-ferror-for-fgets-minishell-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!