Чтение информации из текстового файла
Запись информации в текстовый файл
Как было сказано ранее, для того чтобы начать работать с текстовым файлом, необходимо описать переменную типа ofstream. Например, так:
ofstream F;
Будет создана переменная F для записи информации в файл. На следующим этапе файл необходимо открыть для записи. В общем случае оператор открытия потока будет иметь вид:
F.open(«file», mode);
Здесь F — переменная, описанная как ofstream, file — полное имя файла на диске, mode — режим работы с открываемым файлом. Обратите внимание на то, что при указании полного имени файла нужно ставить двойной слеш. Для обращения, например к файлу accounts.txt, находящемуся в папке sitesна диске D, в программе необходимо указать: D:\\sites\\accounts.txt.
Файл может быть открыт в одном из следующих режимов:
- ios::in — открыть файл в режиме чтения данных; режим является режимом по умолчанию для потоков ifstream;
- ios::out — открыть файл в режиме записи данных (при этом информация о существующем файле уничтожается); режим является режимом по умолчанию для потоков ofstream;
- ios::app — открыть файл в режиме записи данных в конец файла;
- ios::ate — передвинуться в конец уже открытого файла;
- ios::trunc — очистить файл, это же происходит в режиме ios::out;
- ios::nocreate — не выполнять операцию открытия файла, если он не существует;
- ios::noreplace — не открывать существующий файл.
Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока.
После удачного открытия файла (в любом режиме) в переменной F будет храниться true, в противном случае false. Это позволит проверить корректность операции открытия файла.
Открыть файл (в качестве примера возьмем файл D:\\sites\\accounts.txt) в режиме записи можно одним из следующих способов:
//первый способ ofstream F; F.open("D:\\sites\<strong>\</strong>accounts<strong>.</strong>txt", ios::out); //второй способ, режим ios::out является режимом по умолчанию //для потока ofstream ofstream F; F.open("D:\\game\\noobs.txt"); //третий способ объединяет описание переменной и типа поток //и открытие файла в одном операторе ofstream F ("D:\\game\\noobs.txt", ios::out); |
После открытия файла в режиме записи будет создан пустой файл, в который можно будет записывать информацию.
Если вы хотите открыть существующий файл в режиме дозаписи, то в качестве режима следует использовать значение ios::app.
После открытия файла в режиме записи, в него можно писать точно так же, как и на экран, только вместо стандартного устройства вывода cout необходимо указать имя открытого файла.
Например, для записи в поток Fпеременной a, оператор вывода будет иметь вид:
F<<a;
Для последовательного вывода в поток G переменных b, c, d оператор вывода станет таким:
G<<b<<c<<d;
Закрытие потока осуществляется с помощью оператора:
F.close();
В качестве примера рассмотрим следующую задачу.
Задача 1
Создать текстовый файл D:\\sites\\accounts.txt и записать в него n вещественных чисел.
Решение
#include <iostream> #include <fstream> #include <iomanip> using namespace std; int main(){ setlocale (LC_ALL, "RUS"); int i, n; double a; //описывает поток для записи данных в файл ofstream f; //открываем файл в режиме записи, f.open("D:\\sites\\accounts.txt", ios::out); //вводим количество вещественных чисел cout<<"n="; cin>>n; //цикл для ввода и записи чисел в файл for (i=0; i<n; i++){ cout<<"a="; //ввод числа cin>>a; f<<a<<"\t"; } //закрытие потока f.close(); system("pause"); return 0; } |
Int main()
{
ofstream out("C:\\FromC\\myfile.txt"); // Открываем файл для записи
out<<"HelloWorld<<"\n"; //Записываем первую строчку
out<<"UraRabotaet!!!"; //Записываем вторую строчку
Out.close(); //Закрываем файл
return 0;
}
Чтение информации из текстового файла
Для того чтобы прочитать информацию из текстового файла, необходимо описать переменную типа ifstream. После этого нужно открыть файл для чтения с помощью оператора open. Если переменную назвать F, то первые два оператора будут такими:
ifstream F; F.open("D:\\sites\\accounts.txt", ios::in); |
После открытия файла в режиме чтения из него можно считывать информацию точно так же, как и с клавиатуры, только вместо cin нужно указать имя потока, из которого будет происходить чтение данных.
Например, для чтения данных из потока F в переменнуюa, оператор ввода будет выглядеть так:
F>>a;
Два числа в текстовом редакторе считаются разделенными, если между ними есть хотя бы один из символов: пробел, табуляция, символ конца строки. Хорошо, когда программисту заранее известно, сколько и какие значения хранятся в текстовом файле. Однако часто известен лишь тип значений, хранящихся в файле, при этом их количество может быть различным. Для решения данной проблемы необходимо считывать значения из файла поочередно, а перед каждым считыванием проверять, достигнут ли конец файла. А поможет сделать это функция F.eof(). Здесь F— имя потока функция возвращает логическое значение: true или false, в зависимости от того достигнут ли конец файла.
Следовательно, цикл для чтения содержимого всего файла можно записать так:
//организуем для чтения значений из файла, выполнение //цикла прервется, когда достигнем конец файла, //в этом случае F.eof() вернет истину while (!F.eof()) { //чтение очередного значения из потока F в переменную a F>>a; //далее идет обработка значения переменной a } |
Для лучшего усвоения материала рассмотрим задачу.
Задача 2
В текстовом файле D:\\game\\accounts.txt хранятся вещественные числа, вывести их на экран и вычислить их количество.
Решение
#include <iostream> #include <fstream> #include <iomanip> #include <stdlib.h> using namespace std; int main(){ setlocale (LC_ALL, "RUS"); int n=0; float a; fstream F; //открываем файл в режиме чтения F.open("D:\\sites\\accounts.txt"); //если открытие файла прошло корректно, то if (F){ //цикл для чтения значений из файла; выполнение цикла прервется, //когда достигнем конца файла, в этом случае F.eof() вернет истину. while (!F.eof()){ //чтение очередного значения из потока F в переменную a F>>a; //вывод значения переменной a на экран cout<<a<<"\t"; //увеличение количества считанных чисел n++; } //закрытие потока F.close(); //вовод на экран количества считанных чисел cout<<"n="<<n<<endl; }else{ cout<<" Файл не существует"<<endl; } system("pause"); return 0; } |
На этом относительно объемный урок по текстовым файлам закончен. В следующей статье будут рассмотрены методы манипуляции, при помощи которых в C++ обрабатываются двоичные файлы.