[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