Unetway

C ++ - Файлы и потоки

До сих пор мы использовали стандартную библиотеку iostream , которая предоставляет методы cin и cout для чтения со стандартного ввода и записи на стандартный вывод соответственно.

Этот учебник научит вас читать и писать из файла. Для этого требуется другая стандартная библиотека C ++ с именем fstream , которая определяет три новых типа данных -

ofstream

Этот тип данных представляет поток выходных файлов и используется для создания файлов и для записи информации в файлы.

ifstream

Этот тип данных представляет поток входных файлов и используется для чтения информации из файлов.

fstream

Этот тип данных обычно представляет поток файлов и имеет возможности как потока, так и ifstream, что означает, что он может создавать файлы, записывать информацию в файлы и читать информацию из файлов.

Для выполнения обработки файлов в C ++ файлы заголовков <iostream> и <fstream> должны быть включены в исходный файл C ++.

Открытие файла

Файл должен быть открыт, прежде чем вы сможете его прочитать или написать. Для открытия файла для записи может использоваться любой из объектов streamstream или fstream . И объект ifstream используется для открытия файла только для чтения.

Ниже приведен стандартный синтаксис функции open (), который является членом объектов fstream, ifstream и ofstream.

void open(const char *filename, ios::openmode mode);

Здесь первый аргумент указывает имя и местоположение файла, который должен быть открыт, а второй аргумент функции open () определяет режим, в котором файл должен быть открыт.

ios::app

Добавить режим. Весь вывод в этот файл будет добавлен в конец.

ios::ate

Откройте файл для вывода и переместите элемент управления чтением / записью в конец файла.

ios::in

Откройте файл для чтения.

ios::out

Откройте файл для записи.

ios::trunc

Если файл уже существует, его содержимое будет усечено перед открытием файла.

Вы можете объединить два или более из этих ценностей или ИНГ их вместе. Например, если вы хотите открыть файл в режиме записи и хотите усечь его в случае, если он уже существует, следующим будет синтаксис -

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

Аналогичным образом вы можете открыть файл для чтения и записи цели следующим образом:

fstream  afile;
afile.open("file.dat", ios::out | ios::in );

Закрытие файла

Когда программа C ++ завершает работу, она автоматически очищает все потоки, освобождает всю выделенную память и закрывает все открытые файлы. Но всегда хорошо, что программист должен закрыть все открытые файлы до завершения программы.

Ниже приведен стандартный синтаксис функции close (), который является членом объектов fstream, ifstream и ofstream.

void close();

Запись в файл

Выполняя программирование на С ++, вы записываете информацию в файл из своей программы с помощью оператора вставки потока (<<) так же, как вы используете этот оператор для вывода информации на экран. Единственное отличие состоит в том, что вместо объекта cout вы используете объект ofstream или fstream .

Чтение из файла

Вы читаете информацию из файла в вашу программу, используя оператор извлечения потока (>>), так же, как вы используете этот оператор для ввода информации с клавиатуры. Единственное различие заключается в том, что вместо объекта cin вы используете объект ifstream или fstream .

Пример чтения и записи

Ниже приведена программа на C ++, которая открывает файл в режиме чтения и записи. После записи информации, введенной пользователем в файл с именем afile.dat, программа считывает информацию из файла и выводит ее на экран -

#include <fstream>
#include <iostream>
using namespace std;
 
int main () {
   char data[100];

   // open a file in write mode.
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);

   // write inputted data into the file.
   outfile << data << endl;

   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // again write inputted data into the file.
   outfile << data << endl;

   // close the opened file.
   outfile.close();

   // open a file in read mode.
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 

   // write the data at the screen.
   cout << data << endl;
   
   // again read the data from the file and display it.
   infile >> data; 
   cout << data << endl; 

   // close the opened file.
   infile.close();

   return 0;
}

Когда вышеприведенный код скомпилирован и исполнен, он создает следующий образец ввода и вывода -

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

В приведенных выше примерах используются дополнительные функции от объекта cin, например функция getline (), чтобы читать строку извне и игнорировать (), чтобы игнорировать лишние символы, оставленные предыдущим оператором чтения.

Указатели позиции файла

Оба IStream и ostream обеспечивают функции члена для изменения положения указателя файла позиция. Этими функциями-членами являются seekg («seek get») для istream и seekp («seek put») для ostream.

Аргумент seekg и seekp обычно является длинным целым числом. Второй аргумент может быть указан для указания направления поиска. Направление поиска может быть ios :: beg (по умолчанию) для позиционирования относительно начала потока, ios :: cur для позиционирования относительно текущей позиции в потоке или ios :: endдля позиционирования относительно конца поток.

Указатель позиции файла представляет собой целочисленное значение, определяющее местоположение в файле как количество байтов из исходного местоположения файла. Некоторые примеры позиционирования указателя «get» file-position -

// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );

// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );

// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );

// position at end of fileObject
fileObject.seekg( 0, ios::end );