Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Дополнение файла новыми данными

Если файл, который уже существует на диске, открыть с режимом доступа "w", вся информация, имевшаяся в нем на текущий момент, будет уничтожена. Для того чтобы добавить данные в уже существующий на диске файл, следует открывать его с режимом доступа "a". Фактически, большинство компиляторов позволяет в одной программе и создавать файл, и добавлять в него данные. Если режим доступа "a" используется для файла, которого нет на диске, он будет создан, а если файл существует, в него будет добавлена новая информация.

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

Текстовый и двоичный форматы

Функции putc(), fputc() и fputs() служат для вывода текста. Если вы просмотрите дисковый файл, используя команду TYPE, то увидите точно такие же символы, какие ввели. Файл можно создать, использовав любую из этих функций, а затем прочитать из него с помощью функций getc(), fgetc() или fgets(). При этом функции, осуществляющие посимвольное чтение, будут вводить по одному символу, даже если изначально в файл была записана строка с помощью функции fputs(). Аналогично, функции, предназначенные для построчного чтения из файла, будут вводить данные целыми строками, даже если информация в файл была записана посимвольно.

В Листинге 12.8 приведен текст программы, которая копирует содержимое одного файла в другой, одновременно отображая его на экране. Программа будет работать с любым файлом, безотносительно того, как именно он был создан. В программе определены два указателя на файлы, так как мы обращаемся к двум файлам одновременно.

Листинг 12.8. Программа копирования содержимого файлов.

/*filecopy.c*/

#include "stdio.h"

main()

{

FILE *fp1, *fp2;

char infile[25], outfile[25];

int letter;

printf("Введите имя файла для чтения: ");

gets(infile);

if ((fp1 = fopen(infile, "r")) == NULL)

{

printf("Невозможно открыть файл %s", infile);

exit();

}

printf("Введите имя файла для записи: ");

gets(outfile);

if ((fp2 = fopen(infile, "w")) == NULL)

{

printf("Невозможно открыть файл %s", outfile);

fclose(fp1);

exit();

}

while ((letter = fgetc(fp1)) != EOF)

{

putchar(letter);

fputc(letter, fp2);

}

fclose(fp1);

fclose(fp2);

}

Первый файл открывается с режимом доступа "r", чтобы можно было прочитать из него данные. Если файл невозможно открыть, программа завершается. Второй файл открывается с режимом доступа "w", что позволяет записывать в

Рис. 12.6. Функция fprintf() записывает числовые значенияв виде текстовых символов

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

Функция fprintf() записывает все данные в виде текста. Например, если использовать fprintf() для записи числа 34.23 на диск, пять символов будут записаны так, как это показано на рис.12.6. Если в дальнейшем для чтения данных из файла используется функция fscanf(), символы будут преобразованы в числовое значение и в таком виде записаны в переменную.

Вследствие того, что функция fprintf() записывает данные в виде текста, чтение из файла можно осуществлять и с помощью функций getc(), fgetc() или fgets(). Однако эти функции будут читать информацию в виде «печатных» символов. Например, если использовать функцию fgets(), числа будут считываться в виде символов, являющихся частью строки. При отображении на экране или печати на принтере данных, прочитанных с использованием функции fgets() или fgetc(), вы будете лишены возможности выполнения арифметических операций над отдельными элементами данных.