* [Comm] [BUG] feof() и дублирование последней строки
@ 2005-06-07 13:37 php-coder
2005-06-07 13:55 ` [Comm] [BUG] feof() Х ДСАКХПНБЮМХЕ ОНЯКЕДМЕИ ЯРПНЙХ Alexey Rusakov
2005-06-07 13:59 ` [Comm] [BUG] feof() и дублирование последней строки Dmitry V. Levin
0 siblings, 2 replies; 3+ messages in thread
From: php-coder @ 2005-06-07 13:37 UTC (permalink / raw)
To: community
Доброго времени суток сообщество!
Вот заметил тут, что простейший примерчик на Сях работает очень
странно, и даже, прямо таки скажем, неожиданно. Дело в том, что
считывается лишняя строчка, т.е. последння строка файла по неведомой
мне причине считывается дважды.
[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
Объясните что происходит, пожалуйста.. :-)
Пока использую немного переделанную конструкцию:
...
fd = fopen("test.txt", "r");
fscanf(fd, "%s", str);
do {
printf("%s\n", str);
fscanf(fd, "%s", str);
}while(! (feof(fd)));
fclose(fd);
...
P.S. Проверил сегодня этот пример на Visual C++ 6.0 -- все работает
как и должно. Окончательно укоренился в мысли, что это бага. Если да,
то на какой пакет вешать?
Спасибо за внимание!
--
+ php-coder
+ php-coder[at]altlinux[dot]ru
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Comm] [BUG] feof() Х ДСАКХПНБЮМХЕ ОНЯКЕДМЕИ ЯРПНЙХ
2005-06-07 13:37 [Comm] [BUG] feof() и дублирование последней строки php-coder
@ 2005-06-07 13:55 ` Alexey Rusakov
2005-06-07 13:59 ` [Comm] [BUG] feof() и дублирование последней строки Dmitry V. Levin
1 sibling, 0 replies; 3+ messages in thread
From: Alexey Rusakov @ 2005-06-07 13:55 UTC (permalink / raw)
To: community
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;
> }
>
>
[...]
> P.S. Проверил сегодня этот пример на Visual C++ 6.0 -- все работает
> как и должно. Окончательно укоренился в мысли, что это бага. Если да,
> то на какой пакет вешать?
>
>
Для смеха можете повесить на glibc. Вряд ли она долго проживёт. И я бы
не сказал, что Visual C++ 6.0 - это хороший эталон. И компилятору, и
стандартной библиотеке - сто лет в обед, и огрехов там выше крыши.
> Спасибо за внимание!
>
Не пользуйтесь fscanf - это опасно. Это во-первых.
Касаемо вашего вопроса - после fscanf, упирающегося в конец файла, флаг
конца файла не поднимается. Поднимается он тогда когда всё, что прочитал
fscanf - это конец файла. А то, что вы посчитали повторно прочитанной
строкой - это _старое_ значение переменной, которое fscanf не стал
переписывать.
Правильное использование - например, здесь:
http://www.cs.utah.edu/~hamlet/release/lessons/c06/c06/node4.shtml
(найдено через Google)
--
Alexey "Ktirf" Rusakov
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Comm] [BUG] feof() и дублирование последней строки
2005-06-07 13:37 [Comm] [BUG] feof() и дублирование последней строки php-coder
2005-06-07 13:55 ` [Comm] [BUG] feof() Х ДСАКХПНБЮМХЕ ОНЯКЕДМЕИ ЯРПНЙХ Alexey Rusakov
@ 2005-06-07 13:59 ` Dmitry V. Levin
1 sibling, 0 replies; 3+ messages in thread
From: Dmitry V. Levin @ 2005-06-07 13:59 UTC (permalink / raw)
To: ALT Linux general discussion list
[-- Attachment #1: Type: text/plain, Size: 1214 bytes --]
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
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-06-07 13:59 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-06-07 13:37 [Comm] [BUG] feof() и дублирование последней строки php-coder
2005-06-07 13:55 ` [Comm] [BUG] feof() Х ДСАКХПНБЮМХЕ ОНЯКЕДМЕИ ЯРПНЙХ Alexey Rusakov
2005-06-07 13:59 ` [Comm] [BUG] feof() и дублирование последней строки Dmitry V. Levin
ALT Linux Community general discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
public-inbox-index community
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.community
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git