
- •Тема 11. Файлы Зачем нужны файлы?
- •Запись информации в файл
- •Запись в файл значений переменных
- •Указание пути к файлу
- •Чтение информации из файла
- •Чтение файла целиком
- •Режимы открытия файла в Си
- •Бинарный и текстовый режимы
- •Произвольный доступ к файлу
- •Вывод файла в обратном порядке
- •Пример нисходящей разработки
Запись в файл значений переменных
В рассмотренных примерах запись в файл велась посимвольно, однако этот способ не покрывает всех нужд программиста. Например, что делать, если требуется записать в файл значение целочисленной или вещественной переменной? Для этого существуют специальные средства.
В языке C++ для этих целей следует использовать открытый поток аналогично тому, как используется cout. Для примера рассмотрим, как записать в файл сумму двух введённых с клавиатуры чисел.
ofstream myFile("summa.txt");
int a, b;
cout << "Enter two numbers:" << endl;
cin >> a; cin >> b;
int summa = a+b;
myFile << summa << endl;
myFile.close();
По аналогичной схеме можно записать в файл некоторую последовательность. Рассмотрим следующую задачу. Требуется ввести с клавиатуры число N и записать в файл N первых элементов последовательности Фибоначчи.
ofstream myFile("fibonacci.txt");
int n; cout << "N="; cin >> n;
int x0=0, x1=1;
for (int i=0; i<n; i++) {
myFile << x0 << ", ";
int xn=x0+x1;
x0=x1; x1=xn;
}
myFile.close();
Указание пути к файлу
Путь к файлу может быть двух видов:
относительный
абсолютный
При указании относительного пути точкой отсчета является папка, где хранится файл с программой (*.cpp); при использовании абсолютного пути точка отсчета – это «мой компьютер».
При использовании относительного пути можно писать символ «..», который позволяет обратиться к родительской папке, аналогично любому файловому менеджеру:
Чтение информации из файла
Для чтения информации из файла мы рассмотрим Си-шный вариант при помощи функции fgetc() и два С++-ых способа. Схема чтения информации из файла аналогична записи:
объявить файловую переменную;
открыть файл для чтения;
считать информацию из файла;
закрыть файл.
//Шаги 1-2. Объявление файлового указателя
//и открытия файла
FILE* myFile = fopen("hello.txt", "r");
//Шаг 3. Чтение символа из файла
char symbol1 = fgetc(myFile); putchar(symbol1);
char symbol2 = fgetc(myFile); putchar(symbol2);
char symbol3 = fgetc(myFile); putchar(symbol3);
char symbol4 = fgetc(myFile); putchar(symbol4);
char symbol5 = fgetc(myFile); putchar(symbol5);
char symbol6 = fgetc(myFile); putchar(symbol6);
//Шаг 4. Закрытие файла
fclose(myFile);
Чтение файла целиком
Одной из важных задач, связанных с файлами, является чтение файла от начала до конца. Эта задача может быть связана с выводом содержимого файла, загрузкой данных из файла в массив, поиском каких-либо данных в файле и т.д. Задачи могут быть разными, но все они требуют считывания данных из файла, пока этот файл не закончится.
Наиболее простой вариант этой задачи – вывод содержимого файла на экран. Мы рассмотрим следующий алгоритм:
если файл не закончился, то считываем из него один символ и перемещаем файловый указатель далее;
выводим символ на экран.
Напомним, что для считывания одного символа из файла на языке Си используется функция fgetc(). Следующий фрагмент кода, снабжённый комментариями, реализует этот алгоритм.
//Объявляем файловый указатель и открываем файл.
FILE* fp = fopen("tutorial.cpp", "r");
//Пока не конец файла
while (!feof(fp)) {
//Считываем символ
char ch = fgetc(fp);
//Выводи его на экран
putchar(ch);
}
//Закрываем файл
fclose(fp);
После запуска программы на экране появится текст, записанный в файле. Если в качестве файла указать файл с кодом программы, то на экране появится код программы:
Если имя файла указано неправильно, то возникнет ошибка времени исполнения, говорящая о том, что файл с указанным именем не может быть открыт:
Вот как выглядит эта же программа на C++:
ifstream fp("tutorial.cpp");
//Пока неконец файла inFile
while (!fp.eof()) {
//Считываем символ из файла и перемещаем
//файловый указатель на следующую позицию
char symbol = fp.get();
//Выводи считанный символ на экран
cout << symbol;
}
fp.close();
Функции feof() и eof() возвращают true, если конец файла достигнут, и false – иначе.