Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4285

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Глава 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

  игнорируют  такие  символы.  Доступ  к  записан-


background image

Часть 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

. Эти функции используются главным об-

разом при работе с символьными потоками. 


background image

Глава 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)

  символ,  или 


background image

Часть 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

 представляет 


background image

Глава 30. Функции для работы с файлами <stdio.h> 

355 

собой  форматируемую  строку,  которая  содержит  спецификации 
форматов  вывода.  Количество  и  типы  аргументов,  которые  сле-
дуют после строки форматирования, должны соответствовать ко-
личеству  и  типам  спецификаций  формата  вывода,  заданным  в 
строке  форматирования.  Если  эти  условия  не  выполняются,  то 
поведение функции не определено. 
В случае успешного завершения функция возвращает количество 
отформатированных  данных,  а  в  случае  неудачи —  отрицатель-
ное значение и устанавливает индикатор ошибки. 
В общем случае спецификация формата вывода имеет вид: 

  %[флаги][ширина][.точность][модификатор]тип 

где: 

 

флаги

 — это символы, уточняющие формат вывода; 

 

ширина

  задает  минимальное  количество  символов,  выводимых 

по данной спецификации; 

 

точность

  задает  максимальное  или  минимальное  количество 

символов, выводимых по данной спецификации в зависимости 
от 

типа

 

модификатор

 уточняет 

тип

 аргумента; 

 

тип

 задает тип аргумента. 

Для всех форматов вывода может быть установлен флаг 

, кото-

рый выравнивает поле вывода влево. Если этот флаг не установ-
лен, то поле вывода выравнивается вправо. 
Если  поле 

ширина

  опущено  в  спецификации  формата  вывода,  то 

по  умолчанию  она  принимается  равной 

6

  для  типов  данных  с 

плавающей  точкой  и 

1

  для  остальных  типов  данных.  Если  поле 

вывода аргумента больше, чем заданная ширина, то недостающие 
символы заполняются пробелами. 
Перед  десятичным  числом,  обозначающим 

ширину

,  может  быть 

записан ноль. В этом случае ноль рассматривается как 

флаг

, кото-

рый  предписывает  заполнять  поле  вывода  предшествующими 
нулями до достижения заданной ширины. 
Если вместо десятичного числа, определяющего 

ширину

, в специ-

фикации указан символ 

*

, то ширина поля вывода задается значе-


Смотрите также файлы