Здесь len - длина строки. Если бы мы выбросили оператор, помеченный '@', то printf
печатал бы текст через строку, поскольку выдавал бы код '\n' дважды - из строки buffer и из формата "%s\n".
Если в файле больше нет строк (файл дочитан до конца), то функции gets и fgets
возвращают значение NULL. Обратите внимание, что NULL, а не EOF. Пока файл не дочитан, эти функции возвращают свой первый аргумент - адрес буфера, в который была записана очередная строка файла.
Фрагмент для обрубания символа перевода строки может выглядеть еще так:
#include <stdio.h>
#include <string.h>
char buffer[512]; FILE *fp = ... ; ... while(fgets(buffer, sizeof buffer, fp) != NULL){ char *sptr; if(sptr = strchr(buffer, '\n')) *sptr = '\0'; printf("%s\n", buffer); }
В чем отличие puts(s); и fputs(s,fp); ?
Ответ: puts выдает строку s в канал stdout. При этом puts выдает сначала строку s, а затем - дополнительно - символ перевода строки '\n'. Функция же fputs символ перевода строки не добавляет. Упрощенно:
fputs(s, fp) char *s; FILE *fp; { while(*s) putc(*s++, fp); } puts(s) char *s; { fputs(s, stdout); putchar('\n'); }
Найдите ошибки в программе:#include <stdio.h>
main() { int fp; int i; char str[20]; fp = fopen("файл"); fgets(stdin, str, sizeof str); for( i = 0; i < 40; i++ ); fputs(fp, "Текст, выводимый в файл:%s",str ); fclose("файл"); }
Мораль: надо быть внимательнее к формату вызова и смыслу библиотечных функций.
* Это не та "связующая" структура file в ядре, про которую шла речь выше, а ЕЩЕ одна - в памяти самой программы.
** Проверить это состояние позволяет макрос feof(fp); он истинен, если конец был достигнут, ложен - если еще нет.
*** При выполнении вызова завершения программы exit(); все открытые файлы автоматически закрываются.
**** Обозначения fd для дескрипторов и fp для указателей на файл прижились и их следует придерживаться. Если переменная должна иметь более мнемоничное имя - следует писать так: fp_output, fd_input (а не просто fin, fout).
***** Управляющие символы имеют следующие значения:
© Copyright А. Богатырев, 1992-95
Си в UNIX
| |