
- •Тема 11. Файлы Зачем нужны файлы?
- •Запись информации в файл
- •Запись в файл значений переменных
- •Указание пути к файлу
- •Чтение информации из файла
- •Чтение файла целиком
- •Режимы открытия файла в Си
- •Бинарный и текстовый режимы
- •Произвольный доступ к файлу
- •Вывод файла в обратном порядке
- •Пример нисходящей разработки
Тема 11. Файлы Зачем нужны файлы?
Переменные, массивы и структуры хранятся в оперативной памяти компьютера, следовательно, выделенная под них память освобождается после завершения работы программы, и данные, содержащиеся в них, пропадают. Этот факт можно проверить, открыв диспетчер задач и выбрав вкладку «Быстродействие»:
На данной вкладке можно увидеть объем занятой памяти в файле подкачки:
Напишем теперь программу, содержащую объявление большого массива:
int mas[10000000];
Запуск этой программы приведет к тому, что объем занятой памяти увеличится:
После завершения работы программы объем занятой памяти станет прежним:
Очевидно, что такая ситуация недопустима, если данные, с которыми работает программа, остаются актуальными и после ее завершения. Например, записи о рекордах в компьютерной игре не сбрасываются после выхода из нее, а список телефонов в телефонной базе остается неизменным после выхода из оболочки этой базы. Еще одна проблема, связанная с оперативной памятью, заключается в том, что ее размер относительно невелик, и хранить в ней большие объемы информации невозможно.
Возможность хранить информацию независимо от того, работает программа или нет, а также хранить большие объемы информации предоставляют файлы. Они находятся на жестком диске, и их содержимое загружается в оперативную память по мере необходимости.
Запись информации в файл
Рассмотрим, как записать информацию в файл двумя способами: используя конструкции языка Си и конструкции языка C++. На обоих языках запись информации в файл осуществляется в четыре шага:
объявление файловой переменной;
открытие файла для записи;
запись информации в файл;
закрытие файла.
Рассмотрим, как реализуются эти четыре шага на языке Си.
//Библиотека с функциями консольного
//и файлового ввода/вывода
#include <stdio.h>
int main() {
//Объявление файловой переменной myFile
FILE* myFile;
//Открытие файла для записи
myFile = fopen("hello.txt", "w");
//Посимвольная запись слова «Привет» в файл
fputc('П', myFile); fputc('р', myFile);
fputc('и', myFile); fputc('в', myFile);
fputc('е', myFile); fputc('т', myFile);
//Закрытие файла
fclose(myFile);
return 0;
}
После запуска программы откроем файл hello.txt и убедимся, что этот файл создан, и требуемое сообщение записано в него.
В рассмотренной программе объявление файловой переменной и открытие файла можно объединить:
FILE* myFile = fopen("hello.txt", "w");
Рассмотрим теперь, как эта же программа выглядит на C++.
//Библиотека с функциями файлового ввода/вывода
#include <fstream>
using namespace std;
int main() {
//Объявление файлового потока myFile
//и открытие файла для чтения
ofstream myFile("hello_cpp.txt");
//Посимвольная запись слова «Привет» в файл
myFile.put('П'); myFile.put('р');
myFile.put('и'); myFile.put('в');
myFile.put('е'); myFile.put('т');
//Закрытие файла
myFile.close();
return 0;
}
Обратите внимание на то, что все шаги одинаковы для обоих языков. В Си используется процедурный вариант, а в C++ - объектно-ориентированный.