2014-02-12 3 views
0

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

Я проверил, возвращает ли fgets нулевой указатель (который указывает, что содержимое буфера inditerminate), но я хотел бы знать, как использовать 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; 
} 
+1

НЕ используйте goto! –

+4

@Digital_Reality: одна разумная ситуация для использования 'goto' - обработка ошибок. –

+1

@MichaelBurr, который можно обработать, вызвав некоторую функцию очистки. Не так ли? –

ответ

1

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

fgets(str, LINE_LEN, stdin); 

[...] 

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

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

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

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 */ 
    } 
} 
3
fgets(str, LINE_LEN, stdin); 

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

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

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

Вы можете использовать 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..."); 
}