2016-02-06 8 views
0
printf("Batch Mode\n"); 
FILE* batchFile; 
char oneLine[LINE_MAX]; 
batchFile = fopen(argv[1], "r"); 
bool done = false; 

if(batchFile == NULL) 
{ 
    perror("File"); 
    exit(1); 
} 
while (fgets(oneLine,LIMIT,batchFile) != NULL && !done) 
{ 
    processLine(oneLine, done); 
} 

Поэтому у меня есть некоторые сомнения относительно моего кода выше. Проблема в том, что fgets все равно получает строки, даже если строки просто содержат символ новой строки. Поэтому мне нужно устранить это или, по крайней мере, проверить строки, содержащие только новую строку.Как проверить, когда fgets возвращает пустую строку?

Я попытался

if (strcpy(line, '\n') == 0) 
{ 
    printf("an Enter key line\n"); 
    return; 

} 

Но до сих пор она не работает.

+0

код с 'зЬгсру()' не должен был скомпилирован. Если это так, вы либо игнорируете предупреждения компилятора, либо не используете их достаточно. Если у вас включен '', код должен быть отклонен компилятором. –

+0

А также ничего в этом коде не изменяет 'done' после инициализации' false'. –

ответ

0

Как проверить, когда fgets возвращает пустую строку?

Когда строка содержит «\ n», она не считается пустой.

Возврат fgets() содержит возвращенный результат функции. В случае успеха функция возвращает указатель на строку символов с нулевым символом. Если функция встречает конец файла и не читает никаких символов в lineBuffer, он возвращает указатель NULL. Если возникает ошибка чтения, fgets возвращает NULL и устанавливает errno в ненулевое значение.

Итак, проверьте все возможности.

Изменить эту строку:

while(fgets(oneLine,LIMIT,batchFile) != NULL && !done) //LIMIT is not the size of 
                 //the buffer oneLine 

в

while (fgets(oneLine,LINE_MAX,batchFile) != NULL && !done) 
{ 
    if (errno != 0) {//handle error, exit} 
    //proceed with normal line processing 
    if (strcmp(oneLine, "\n") != 0)//strcmp verifies line has more than only \n 
    { 
     processLine(oneLine,done); 
    } 
+0

Установка 'errno' не указана стандартом C. Если бы код зависел от этого, тогда было бы разумно «errno = 0» перед каждым вызовом 'fgets(). Если 'NULL' возвращается из-за ошибки,' ferror() 'возвращает ненулевое значение. – chux

Смежные вопросы