Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема9_Файлы.doc
Скачиваний:
2
Добавлен:
09.08.2019
Размер:
146.43 Кб
Скачать

Тема 9. Файлы Зачем нужны файлы?

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

На данной вкладке можно увидеть объем занятой оперативной памяти:

Напишем теперь программу, содержащую объявление большого массива:

int mas[10000000];

Запуск этой программы приведет к тому, что объем занятой оперативной памяти увеличится:

После завершения работы программы объем занятой памяти станет прежним:

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

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

Запись информации в файл

Для записи информации в файл предназначены несколько функций, среди которых

  • fputc();

  • fputs();

  • fprintf().

Запись осуществляется в четыре шага:

  1. описание файловой переменной (файлового указателя);

  2. открытие файла для записи;

  3. запись информации в файл;

  4. закрытие файла.

Следующий фрагмент кода демонстрирует эти шаги в действии:

//Описание файловой переменной myFile

FILE* myFile;

//Открытие файла для записи

myFile = fopen("hello.txt", "w");

//Запись сообщения «Привет!» в файл

fputc('П', myFile); fputc('р', myFile);

fputc('и', myFile); fputc('в', myFile);

fputc('е', myFile); fputc('т', myFile);

fputc('!', myFile);

//Закрытие файла

fclose(myFile);

Функция fputc() записывает в файл hello.txt один символ.

Результатом запуска программы будет создание на диске файла hello.txt, содержимым которого станет фраза «Привет!» Следует обратить внимание на то, что, если путь к файлу не указан, то он создается в той же папке, что и файл с кодом программы (в данном случае – это файл main.cpp):

Проверьте содержимое файла, открыв его в любом текстовом редакторе:

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

fputs("Это моя строка.", myFile);

Функция fprintf() осуществляет запись в файл согласно шаблону:

fprintf(myFile, "%s получил %d.", "Павел", 5);

Указание пути к файлу

Путь к файлу может быть двух видов:

  • относительный

  • абсолютный

При указании относительного пути точкой отсчета является папка, где хранится файл с программой (*.cpp); при использовании абсолютного пути точка отсчета – это «мой компьютер».

При использовании относительного пути можно писать символ «..», который позволяет обратиться к родительской папке, аналогично любому файловому менеджеру:

Функция открытия файла fopen() принимает два параметра; первый – это имя файла, а второй – режим открытия файла. Для создания файла в другой папке следует указать его полный путь.

Чтение информации из файла

Прочитать содержимое файла можно при помощи функций

  • fgetc();

  • fgets();

  • fscanf().

несколькими способами, самым простым из которых является посимвольное чтение с помощью функции fgetc(). Для этого нужно выполнить четыре шага:

  1. описать файловую переменную (файловый указатель);

  2. открыть файл для чтения;

  3. считать информацию из файла;

  4. закрыть файл.

//Шаг 1. Объявление файлового указателя

FILE* myFile;

//Шаг 2. Открытие файла для чтения

myFile = fopen("hello.txt", "r");

//Шаг 3. Чтение символа из файла

char symbol = fgetc(myFile);

putchar(symbol);

//Шаг 4. Закрытие файла

fclose(myFile);

Чтение файла целиком

FILE* fp = fopen("tutorial.cpp", "r");

while (!feof(fp)) {

char ch = fgetc(fp);

putchar(ch);

}

fclose(fp);

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

В двух рассмотренных примерах использовались режимы открытия файла для записи – w и для чтения – r. Существуют еще ряд режимов, некоторые из которых приведены ниже:

Режим

Описание режима

открытия файла

Если файл не существует

Если файл существует

r

Чтение

Ошибка

-

w

Запись

Создается

Очищается

a

Добавление

Создается

-

r+

Чтение/запись

Ошибка

-

w+

Запись/чтение

Создается

Очищается

a+

Добавление/чтение

Создается

-

Остановимся на режиме добавления. Дело в том, что режим w стирает содержимое файла, если он уже существует, а режим a добавляет новые записи в конец.

FILE* outFile = fopen("result.cpp", "w");

int fib_0=0;

int fib_1=1;

for (int i=0; i<20; i++) {

int fib_2 = fib_0+fib_1;

fprintf(outFile, "%d ", fib_2);

fib_0=fib_1;

fib_1=fib_2;

}

fclose(outFile);

Бинарный и текстовый режимы

Текстовый режим

r

w

a

r+

w+

a+

Бинарный режим

rb

wb

ab

rb+

wb+

ab+