Тема 9. Файлы Зачем нужны файлы?
Переменные, массивы и структуры хранятся в оперативной памяти компьютера, следовательно, выделенная под них память освобождается после завершения работы программы, и данные, содержащиеся в них, пропадают. Этот факт можно проверить, открыв диспетчер задач и выбрав вкладку «Быстродействие»:
На данной вкладке можно увидеть объем занятой оперативной памяти:
Напишем теперь программу, содержащую объявление большого массива:
int mas[10000000];
Запуск этой программы приведет к тому, что объем занятой оперативной памяти увеличится:
После завершения работы программы объем занятой памяти станет прежним:
Очевидно, что такая ситуация недопустима, если данные, с которыми работает программа, остаются актуальными и после ее завершения. Например, записи о рекордах в компьютерной игре не сбрасываются после выхода из нее, а список телефонов в телефонной базе остается неизменным после выхода из оболочки этой базы. Еще одна проблема, связанная с оперативной памятью, заключается в том, что ее размер относительно невелик, и хранить в ней большие объемы информации невозможно.
Возможность хранить информацию независимо от того, работает программа или нет, а также хранить большие объемы информации предоставляют файлы. Они находятся на жестком диске, и их содержимое загружается в оперативную память по мере необходимости.
Запись информации в файл
Для записи информации в файл предназначены несколько функций, среди которых
fputc();
fputs();
fprintf().
Запись осуществляется в четыре шага:
описание файловой переменной (файлового указателя);
открытие файла для записи;
запись информации в файл;
закрытие файла.
Следующий фрагмент кода демонстрирует эти шаги в действии:
//Описание файловой переменной 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. Объявление файлового указателя
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+ |