[Comm] [BUG] feof() и дублирование последней строки

Dmitry V. Levin =?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Вт Июн 7 17:59:46 MSD 2005


On Tue, Jun 07, 2005 at 08:37:36PM +0700, php-coder wrote:
>     Вот заметил тут, что простейший примерчик на Сях работает очень
>     странно, и даже, прямо таки скажем, неожиданно. Дело в том, что
>     считывается лишняя строчка, т.е. последння строка файла по неведомой
>     мне причине считывается дважды.
> 
>     [c0der на mycomp ~]$ cat test.c
>     #include <stdio.h>
>     int main()
>     {
>      char str[100];
>      FILE *fd;
> 
>      fd = fopen("test.txt", "r");
>         
>      while(! (feof(fd))) {
>        fscanf(fd, "%s", str);
>        printf("%s\n", str);
>      }
>      fclose(fd);
> 
>      return 0;
>     }
> 
>     [c0der на mycomp ~]$ cat test.txt
>     1
>     2
>     3
>     [c0der на mycomp ~]$ ./test
>     1
>     2
>     3
>     3
>                  
>     Объясните что происходит, пожалуйста.. :-)

Происходит непонимание стандартной библиотеки языка C.
Вы сначала проверяете состояние потока, а потом читаете из потока и
используете якобы прочитанное без проверки результата операции чтения.

Для прояснения картины добавьте memset(str,0,sizeof str) перед вызовом fscanf().
И вообще, не используйте fscanf() таким образом.


-- 
ldv
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20050607/cc49a569/attachment-0003.bin>


Подробная информация о списке рассылки community