ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4285
Скачиваний: 28
Глава 30. Функции для работы с файлами <stdio.h>
351
{
FILE* out;
char str[80];
int n = 0;
/* открываем поток для записи в текстовом режиме */
out = fopen("text.txt", "w");
printf("Input a string:\n");
/* ввод строки с консоли */
gets(str);
/* пишем символы в файл */
while (str[n])
fputc(str[n++], out);
/* закрываем выходной поток */
fclose(out);
return 0;
}
Функция
fgetc
имеет следующий прототип:
int fgetc(FILE* stream);
Эта функция читает символ из потока
stream
и продвигает инди-
катор позиции на следующий символ. В случае успешного за-
вершения функция возвращает прочитанный символ. В случае
достижения конца файла функция возвращает значение
EOF
и ус-
танавливает индикатор конца файла. В случае ошибки функция
возвращает значение
EOF
и устанавливает индикатор ошибки.
Функция
getc
имеет следующий прототип:
int getc(FILE* stream);
Эта функция работает так же, как и функция
fgetc
, но может
быть реализована как макрокоманда.
Функция
ungetc
имеет следующий прототип:
int ungetc(int c, FILE* stream);
Эта функция возвращает символ
c
в поток
stream
. Функции
fseek
,
fsetpos
и
rewind
игнорируют такие символы. Доступ к записан-
Часть III. Стандартная библиотека языка программирования C
352
ным символам выполняется по правилу
FIFO
. В случае успеха
функция возвращает записанный символ, а в случае неудачи —
EOF
.
В листинге 30.4 приведен пример чтения символов из файла, соз-
данного программой из листинга 30.3.
Листинг 30.4. Чтение символов из файла
#include <stdio.h>
int main()
{
FILE* in;
char c;
/* открываем поток для чтения в текстовом режиме */
if(!(in = fopen("text.txt", "r")))
{
printf("Open file failed.\n");
return 0;
}
c = fgetc(in); /* читаем первый символ из файла */
while (!feof(in))
{
putc(c, stdout); /* выводим символ на консоль */
c = fgetc(in); /* читаем остальные символы из файла*/
}
putc('\n', stdout);
/* закрываем входной поток */
fclose(in);
return 0;
}
30.10. Запись/чтение строк из файла
Для записи/чтения строки из файла в языке С предназначены
функции
fputs
и
fgets
. Эти функции используются главным об-
разом при работе с символьными потоками.
Глава 30. Функции для работы с файлами <stdio.h>
353
Функция
fputs
имеет следующий прототип:
int fputs(const char* str, FILE* stream);
Эта функция записывает строку
str
в файл
stream
, не включая
завершающий нулевой байт. В случае успешного завершения
функция возвращает ненулевое число, а в случае неудачи —
EOF
.
Пример использования функции
fputs
приведен в листинге 30.3.
Листинг 30.5. Запись строк в файл
#include <stdio.h>
int main()
{
FILE* out;
char str[80];
/* открываем поток для записи в текстовом режиме */
out = fopen("text.txt", "w");
printf("Press Ctrl+z to exit.\n");
printf("Input strings:\n");
/* ввод строк с консоли */
gets(str);
while (!feof(stdin))
{
fputs(str, out); /* пишем строку в файл */
putc('\n', out); /* переход на новую строку в файл */
gets(str);
}
/* закрываем выходной поток */
fclose(out);
return 0;
}
Функция
fgets
имеет следующий прототип:
int fgets(char* str, int n, FILE* stream);
Эта функция читает строку из потока
stream
в строку
str
. Оста-
навливается функция в случае, если прочитан
(n-1)
символ, или
Часть III. Стандартная библиотека языка программирования C
354
встретился символ
\n
, или обнаружен конец файла. В любом из
этих случаев в конец строки помещается символ
\n
, за которым
записывается пустой символ
\0
. В случае успеха функция воз-
вращает указатель
str
, а в случае неудачи —
NULL
. Если не прочи-
тан ни один символ и обнаружен конец файла, то строка
str
не
изменяется, а функция возвращает значение
NULL
.
В листинге 30.6 приведен пример чтения строк из файла, который
был создан программой, приведенной в листинге 30.5.
Листинг 30.6. Чтение строк из файла
#include <stdio.h>
int main()
{
FILE* in;
char str[80];
/* открываем поток для чтения в текстовом режиме */
if(!(in = fopen("text.txt", "r")))
{
printf("Open file failed.\n");
return 0;
}
while (fgets(str, 80, in)) /* чтение строк из файла */
fputs(str, stdout); /* выводим строку на консоль */
/* закрываем выходной поток */
fclose(in);
return 0;
}
30.11. Форматированный вывод
Для форматированного вывода данных в файл предназначена
функция
fprintf
, которая имеет следующий прототип:
int fprintf(FILE* stream, const char* format, ...);
Эта функция выполняет запись данных в файл
stream
в соответ-
ствии с форматной строкой
format
. Параметр
format
представляет
Глава 30. Функции для работы с файлами <stdio.h>
355
собой форматируемую строку, которая содержит спецификации
форматов вывода. Количество и типы аргументов, которые сле-
дуют после строки форматирования, должны соответствовать ко-
личеству и типам спецификаций формата вывода, заданным в
строке форматирования. Если эти условия не выполняются, то
поведение функции не определено.
В случае успешного завершения функция возвращает количество
отформатированных данных, а в случае неудачи — отрицатель-
ное значение и устанавливает индикатор ошибки.
В общем случае спецификация формата вывода имеет вид:
%[флаги][ширина][.точность][модификатор]тип
где:
флаги
— это символы, уточняющие формат вывода;
ширина
задает минимальное количество символов, выводимых
по данной спецификации;
точность
задает максимальное или минимальное количество
символов, выводимых по данной спецификации в зависимости
от
типа
;
модификатор
уточняет
тип
аргумента;
тип
задает тип аргумента.
Для всех форматов вывода может быть установлен флаг
—
, кото-
рый выравнивает поле вывода влево. Если этот флаг не установ-
лен, то поле вывода выравнивается вправо.
Если поле
ширина
опущено в спецификации формата вывода, то
по умолчанию она принимается равной
6
для типов данных с
плавающей точкой и
1
для остальных типов данных. Если поле
вывода аргумента больше, чем заданная ширина, то недостающие
символы заполняются пробелами.
Перед десятичным числом, обозначающим
ширину
, может быть
записан ноль. В этом случае ноль рассматривается как
флаг
, кото-
рый предписывает заполнять поле вывода предшествующими
нулями до достижения заданной ширины.
Если вместо десятичного числа, определяющего
ширину
, в специ-
фикации указан символ
*
, то ширина поля вывода задается значе-