Лабораторная работа №16
Работа с файловыми потоками в С++. Текстовые файлы
Потоковый ввод/вывод дисковых файлов
Для работы с дисковыми файлами необходимо подключение заголовочного файла <fstream>, содержащего наборы специальных классов:
-
ifstream — для ввода,
-
ofstream — для вывода,
-
fstream — для чтения и записи данных в один и тот же файл.
Чтобы получить возможность работать с дисковым файлом, нужно открыть его с указанием режима доступа, который определяется значением константы open-mode класса ios.
Таблица 16.1.
Режим доступа |
Стандарт |
Действие |
app |
нет |
открывает файл для дозаписи |
ate(atend) |
да |
при открытии файла устанавливает файловый указатель на конец файла |
binary(bin) |
да |
открыть файл в двоичном представлении |
in |
да |
открыть файл для чтения (ввода) |
nocreate |
нет |
если файл не существует, то новый файл не создается |
noreplace |
нет |
если файл уже существует, файл не перезаписывается |
out |
да |
открыть файл для записи (вывода) |
trunc |
нет |
Открывает и усекает существующий файл. Новая информация замещает существующую |
Текстовые файлы
Создание и запись.
Для создания текстового файла определяют объект класса ofstream и передают конструктору класса имя дискового файла в качестве первого параметра и режим доступа в качестве второго параметра:
ofstream out_file(“Out.txt”, ios::out);
Можно объявить константу, определяющую режим открытия файла, например:
const ios::open_mode=ios::out | ios::app;
После того, как предпринималась попытка открыть файл, следует убедиться в том, что файл открыт и готов для записи (или перезаписи):
if (! out_file) { cerr<<”Error: unable to write to out.txt”<<endl;
exit(1);
}
Все сказанное верно и для файлов, открываемых для чтения (или входных файлов):
ifstream in_file(“Input.txt”, ios::in);
if (! in_file) { cerr<<”Error: unable to open Input.txt”<<endl;
exit(1);
}
При работе с текстовыми файлами наиболее часто встречаются четыре действия:
|
|
Посимвольное чтение текста.
Функция get(), которая является методом istream, применяется для посимвольного чтения текстового файла.
Пример 16.1. Посимвольное чтение файла и вывод его на экран.
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{char sym;
ifstream in_file ("d:\\Input.txt", ios::in);
if (!in_file) { cerr << "Error input file"
<< endl;
exit(1);
}
while (in_file) { in_file.get(sym);
cout << sym;
}
cout << endl;
_getch();
return 0;
}
Посимвольная запись текста.
Функция put(), которая является методом ostream, позволяет осуществлять посимвольную запись данных в текстовый файл.
Пример 16.2. Посимвольная запись данных в текстовый файл.
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "Russian"); // подключение русификатора
string quote = "Зорко одно лишь сердце. Самого главного глазами не увидишь. А. де Сент-Экзюпери";
/* в ранних версиях объявление строки quote выглядит так:
char *quote = "Зорко одно лишь сердце. Самого главного гла-зами не увидишь. А. де Сент-Экзюпери"; */
ofstream out_file ("Out_file.txt", ios::out);
if (!out_file) { cerr << "Error output file"
<< endl;
exit(1);
}
for (unsigned int i = 0; i < quote.size(); i++)
out_file.put(quote[i]);
/* в ранних версиях длина строки quote определяется по-другому:
for (int i = 0; i < strlen(quote) + 1; i++)
out_file.put(quote[i]); */
cout << "Конец записи" << endl;
_getch();
return 0;
}
Построчное чтение файла.
Обычно построчное чтение и запись файлов работают быстрее посимвольных действий. Для чтения строки из файла воспользуемся функцией getline(), которая является методом класса ifstream. Функция читает строку (в том числе и разделители), пока не встретит символ новой строки ‘\n’, помещая ее в буфер (первый аргумент функции). Максимальный размер буфера задается как второй аргумент функции.
Пример 16.3. Построчное чтение файла.
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{const int LEN = 80;
char BUF[LEN];
ifstream in_file("d:\\Input.txt", ios::in);
if (!in_file) { cerr << "Error input file" << endl;
exit(1);
}
while (in_file)
{ in_file.getline(BUF,LEN);
cout << BUF << endl;
}
_getch();
return 0;
}
Построчная запись текста.
Пример 16.4. Построчная запись текста в файл.
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "Russian"); // подключение русификатора
ofstream out_file ("Out_file.txt", ios::out);
if (!out_file){ cerr << "Error output file" << endl;
exit(1);
}
out_file << "Я не знаю, где встретиться\n";
out_file << "Нам придется с тобой,\n";
out_file << "Глобус крутится-вертится,\n";
out_file << "Словно шар голубой\n";
_getch();
return 0;
}
Записываемые строки являются не объектами класса string, а строками типа *char, завершающимися символом ‘\n’.