Чтение информации из текстового файла

Запись информации в текстовый файл

Как было сказано ранее, для того чтобы начать работать с текстовым файлом, необходимо описать переменную типа 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++ обрабатываются двоичные файлы.

Наши рекомендации