Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабараторная работа 7.doc
Скачиваний:
8
Добавлен:
01.03.2016
Размер:
92.16 Кб
Скачать

Форматированный вывод (запись в файл)

Вы уже встречались с функцией printf, которая обеспечивает вывод данных на стандартное устройство вывода и является версией более общей функции fprintf, вызов которой имеет вид:

fprintf(fp, control_string_pointer, аргументы, ...)

int a;

FILE *f;

. . . .

fprintf(f,”%d”,a); %запись значения переменной а в файлf

(Заметьте, что функция printf просто является частным случаем функции fprintf: указателем типа FILE -fpв ней являетсяstdout.)

В данном примере переменная fp является попросту указателем файла, инициируемым функцией fopen. Вторым аргументом функции fprintf является указатель на строку (обычно строкова константа), которая состоит из текста и спецификаций преобразования. Текст выводится без изменений (за исключением специальных символов). Для каждой спецификации преобразования значение очередного аргумента соответствующим образом преобразуется и выводится вместо спецификации (таким образом, число аргументов функции fprintf является переменным).

Обычно при успешном вызове функция fprintf возвращает положительное целое число, означающее число выведенных символов (возможны вариации). Если число отрицательно (обычно EOF), то это свидетельствует об ошибке либо при преобразовании данных, либо при выводе их на устройство.

Форматированный ввод (чтение файла)

Форматированные данные вводятся с помощью функции fscanf. Ее аргументы те же, что и у функции fprintf:

fscanf(fp, control_string_pointer, аргументы, ...)

inta;

FILE*f;

. . . .

fscanf(f,”%d”,a); %чтение значения в переменную а из файлаf

(функция scanf аналогична функции fscanf, но использует в качестве указателя файла stdin).

Управляющая строка (2-ой аргумент) содержит спецификации преобразования, которые показывают, каким образом должно быть преобразовано каждое вводимое поле. Преобразованные значения полей сохраняются по адресам, указанным в соответствующих аргументах, следующих за управляющей строкой (поскольку здесь осуществляется вызов по адресу, то эти аргументы должны быть указателями). Как и функция fprintf, функция fscanf имеет переменное число аргументов.

Интерпретация управляющей строки функции fscanf аналогична, но не идентична интерпретации управляющей строки функции fprintf. У этой функции, как и у функции printf, управляющая строка состоит из текста и спецификаций преобразования. Входящие в текст пробелы, символы табуляции или перехода на новую строку игнорируются. Другие символы (за исключением спецификаций преобразования) образуют шаблон, с которым должны совпадать вводимые данные.

Учтите, что при вводе строки при помощи функции fscanf (scanf) завершающий нулевой байт автоматически добавляетсяк ее концу.

При успешном вызове функция fscanf возвращает положительное число, означающее число введенных полей. Функция fscanf возвращает значение EOF, если обнаружен конец файла, или нуль, если имели место ошибки при преобразовании данных или при их вводе с устройства.

Построчный ввод-вывод

Функции построчного ввода-вывода обеспечивают чтение и запись полных строк данных за один прием. Строка представляет собой последовательность символов, завершенную символом перехода на новую строку или символом возврата каретки.

Построчный ввод выполняется функцией:

fgets(char_pointer, size, fp)

которая считывает строку данных из файла, соответствующего указателю fp, в массив символов (или в область памяти с указанным адресом), заданный аргументом char_pointer. (Функция gets считывает данные из файла, соответствующего указателю stdin.) Функция gets добавляет нулевой байт к концу строки после считывания ее в память.

char s[80];

FILE *f;

. . . . .

fgets(s, 80, f); %читаем строку из файла

Символы считываются из файла до тех пор, пока не будет выполнено одно из следующих условий:

  1. обнаружен конец строки;

  2. обнаружен конец файла;

  3. число символов в считываемой строке равно size.

Чтобы избежать переполнения области памяти, в которую считывается строка, в нее должно быть считано не более size-1 символов (чтобы хватило места и для нулевого байта). Если длина считываемой строки превышает size, то считывание остальных символов будет продолжено при последующем вызове функции fgets.

Функция fgets возвращает значение, которое равно либо исходному значению аргумента char_pointer (указателя на область памяти), либо значению EOF, если обнаружен конец файла.

Обычно различия между функциями fgets и gets минимальны. Если входная строка завершается символом перехода на новую строку, то функция fgets поместит его в память, в то время как gets игнорирует его.

Построчный вывод в файл выполняется функцией:

fputs(char_pointer, fp)

которая передет данные из массива символов с адресом char_pointer в файл, соответствующий указателю fp, до тех пор, пока не будет обнаружен завершающий строку нулевой байт.

chars[80];

FILE*f;

. . . . .

fputs(s,f); %записываем строку в файл

Функция fputs возвращает отрицательное значение, обычно EOF, если обнаружена ошибка при выводе данных. Значение, которое возвращается после успешного вызова функции, зависит от реализации, но обычно отличается от EOF.

Обычно различия между функциями fputs и puts минимальны. Функция puts помещает в файл кроме строки еще и символ перехода на новую строку.

Следующая программа выполняет слияние файлов, но на этот раз с помощью построчного ввода-вывода:

#include <stdlib.h> #include <stdio.h> int main() {   FILE *sp, *tp;   char line[81];   if((sp = fopen("1.dat","r")) == NULL)   {     printf("Ошибка при открытии файла 1.dat\n");     exit(1);   }   if((tp = fopen("2.txt","a")) == NULL)   {     printf("Ошибка при открытии файла 2.txt\n");     exit(1);   }   while(fgets(line,sizeof(line)-1,sp)) != EOF)   {     fputs(line,tp);   }   fclose(sp);   fclose(tp);   return 0; }

Вместо считывания по одному символу за прием эта программа считывает полную строку (до 80 символов). Имейте в виду, что функция fputs записывает в файл символы из строки line до тех пор, пока не обнаружит нулевой байт (помещенный в нее функцией fgets).