обнаружить EOL в C, используя fgets - PullRequest
0 голосов
/ 10 октября 2011

Я пытаюсь прочитать одну строку из файла, используя следующее ...

 while(fgets(c,BUF,f) != EOL){
   puts(c);
 }

Где EOL = #define EOL '\n' однако я получаю предупреждение ... comparison between pointer and integer

Как правильно достичь того, что я пытаюсь?

Ответы [ 4 ]

4 голосов
/ 10 октября 2011

fgets читает строку, а тип результата - char*

Я думаю, что вы думаете о fgetc вместо?

0 голосов
/ 10 октября 2011

fgets читает символы из потока и записывает их в буфер до тех пор, пока либо буфер почти не заполнится, либо не найдет '\n' (при неудачной операции возвращается NULL).

Таким образом, вы можетезнать, сколько символов characeters было прочитано (включая '\n') с помощью strlen ...

ret = fgets(buffer, sizeof buffer, stdin);
if (ret == NULL) /* deal with error */;
chars = strlen(buffer);

Теперь может произойти одно из двух: либо '\n' было прочитано до того, как буфер был получензаполнен или буфер заполнен до чтения '\n'.Вы можете узнать, что это было, изучив последний символ в буфере

if (buffer[chars - 1] == '\n') /* full line read */;
else /* incomplete line */;

Обратите внимание, что chars всегда (*) 1 или больше, поэтому выражение buffer[chars - 1] в порядке.

(*) это может быть 0 только с двоичными данными для ввода, но это запрещает использование strlen и других строковых функций.

0 голосов
/ 10 октября 2011

Вы должны проверить содержимое c после вызова fgets, чтобы определить, была ли новая строка включена в возвращаемую строку:

for (;;) {
 if (fgets(c, BUF, f) == NULL) { /* handle error */ }
 if (strchr(c, EOL) != NULL) {
  puts(c);
 } else {break; }
}
0 голосов
/ 10 октября 2011

Вам нужно разыменовать возвращенный char* и сравнить его с вашим EOL ... не сравнивать сам фактический адрес указателя с символом конца строки.

Измените свой код на этот:

char* return_val = NULL;
while((return_val = fgets(c,BUF,f)) != NULL && *return_val != EOF)
{
   puts(c);
}

if (retun_val == NULL)
{
    //handle error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...