From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <42A5A764.9000705@altlinux.ru> Date: Tue, 07 Jun 2005 17:55:48 +0400 From: Alexey Rusakov User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050512 Thunderbird/1.0.2 Mnenhy/0.7 X-Accept-Language: en-us, en MIME-Version: 1.0 To: community@altlinux.ru Subject: Re: [Comm] [BUG] feof() =?UTF-8?B?0KUg0JTQodCQ0JrQpdCf0J3QkdCu0Jw=?= =?UTF-8?B?0KXQlSDQntCd0K/QmtCV0JTQnNCV0Jgg0K/QoNCf0J3QmdCl?= References: <20050607133736.GA4274@mycomp.mydomain> In-Reply-To: <20050607133736.GA4274@mycomp.mydomain> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-BeenThere: community@altlinux.ru X-Mailman-Version: 2.1.5 Precedence: list Reply-To: community@altlinux.ru List-Id: Mailing list for ALT Linux users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Jun 2005 13:55:52 -0000 Archived-At: List-Archive: List-Post: php-coder wrote: > Доброго времени суток сообщество! > > Вот заметил тут, что простейший примерчик на Сях работает очень > странно, и даже, прямо таки скажем, неожиданно. Дело в том, что > считывается лишняя строчка, т.е. последння строка файла по неведомой > мне причине считывается дважды. > > [c0der@mycomp ~]$ cat test.c > #include > 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