Странность с fgets()

Автор: kramer Дата: 01.02.2008 21:40 Решил побаловаться программированием, и столкнулся с интересной проблемой. Вроде, в досовских C такого не встречал... или я чего неверно делаю? В общем
---
$cat file
121
122
123
124
$cat testff.c
#include <stdio.h>

int main()
{
FILE *f = fopen("./file", "r";-);

while (!feof(f))
{
char str[128];
fgets(str, 128, f);
puts(str);
}
fclose(f);
return 0;
}
$gcc testff.c -o testff
$./testff
121

122

123

124

124

---
Интересует, почему последняя строка прочиталась дважды.
Re: Странность с fgets() 01.02.2008 23:01peter_ir Я думаю, строка не прочиталась, а напечаталсь дважды.
Попробуй проверять на неравенство EOF.
И не надо буфер создавать в цикле.
Re: Странность с fgets() 02.02.2008 03:03Bircoph Когда вы достигаете конца файла, fgets() возвращает NULL, и
потом вы пытаетесь его распечатать! Результат работы не
предсказуем. Вам повезло, что просто дублируется строка,
мог и segfault быть.

Нужно было делать цикл while (!fgets(...)) {}. Но лучше
используйте getline().
Re: Странность с fgets() 02.02.2008 11:53kramer Ага, понял. Но я думал, что после того как fgets() достигла конец файла, feof() вернёт "истину" и цикл закончится. По моему, было бы логично. Но всё равно спасибо.
Re: Странность с fgets() 02.02.2008 13:12peter_ir Я, кстати, не заметил, что в while - feof.
Вообще я предпочитаю (fscanf(in_file,"%[^ ]",buffer)!=EOF), а потом разбирать строку
в буфере.
Re: Странность с fgets() 02.02.2008 14:57kramer >Когда вы достигаете конца файла, fgets() возвращает NULL, и
потом вы пытаетесь его распечатать!

Bircoph, я не настолько чайник. Под DOS и Win когда-то писал прилично. Печатал то я локальный массив str, а не то, что вернула fgets().

Кстати, в тему: а почему из программы в opendir() не сработал маршрут "~/massmail" и пришлось писать "/home/other/massmail" ? Какая функция в таком случае автоматически расширит маршрут?
Re: Странность с fgets() 02.02.2008 16:11Bircoph > Печатал то я локальный массив str, а не то, что вернула
> fgets().

Ах, точно. Ну теперь всё совершенно ясно: последний вызов
fgets() возвращал NULL и не менял значения str.

> не сработал маршрут "~/massmail"

1) Не забывайте, что "~" -- это разрешённое имя
файла/директории.
2) opendir() автодополнением не занимается.
3) Используйте экспансию wordexp(); или, в вашем конкретном
случае, проще прочитать переменную $HOME с помощью
getenv("HOME";-).

И настоятельнорекомендую обратить вам свой взор на info libc,
там очень детально и хорошо структурировано описаны все
базовые системные функции, в частности, упомянутые выше.
Re: Странность с fgets() 13.02.2008 05:02s1avaz Убито, ибо поздно и голова не думает Улыбка
RSS-материал