Файлы и потоки C ++
До сих пор мы использовали iostream стандартная библиотека, которая предоставляет cin а также cout методы для чтения из стандартного ввода и записи в стандартный вывод соответственно.
Из этого туториала Вы узнаете, как читать и писать из файла. Для этого требуется другая стандартная библиотека C ++ под названиемfstream, который определяет три новых типа данных -
Старший Нет | Тип данных и описание |
---|---|
1 | ofstream Этот тип данных представляет поток выходного файла и используется для создания файлов и записи информации в файлы. |
2 | ifstream Этот тип данных представляет поток входного файла и используется для чтения информации из файлов. |
3 | fstream Этот тип данных представляет файловый поток в целом и имеет возможности как ofstream, так и ifstream, что означает, что он может создавать файлы, записывать информацию в файлы и читать информацию из файлов. |
Чтобы выполнить обработку файлов в C ++, файлы заголовков <iostream> и <fstream> должны быть включены в исходный файл C ++.
Открытие файла
Файл должен быть открыт, прежде чем вы сможете читать из него или писать в него. Либоofstream или же fstreamобъект может использоваться для открытия файла для записи. А объект ifstream используется для открытия файла только для чтения.
Ниже приведен стандартный синтаксис для функции open (), которая является членом объектов fstream, ifstream и ofstream.
void open(const char *filename, ios::openmode mode);
Здесь первый аргумент указывает имя и расположение файла, который нужно открыть, а второй аргумент open() функция-член определяет режим, в котором должен быть открыт файл.
Старший Нет | Флаг и описание режима |
---|---|
1 | ios::app Режим добавления. Весь вывод в этот файл будет добавлен в конец. |
2 | ios::ate Откройте файл для вывода и переместите элемент управления чтением / записью в конец файла. |
3 | ios::in Откройте файл для чтения. |
4 | ios::out Откройте файл для записи. |
5 | ios::trunc Если файл уже существует, его содержимое будет обрезано перед открытием файла. |
Вы можете объединить два или более этих значения, ORсоединяя их вместе. Например, если вы хотите открыть файл в режиме записи и хотите усечь его, если он уже существует, синтаксис будет следующим:
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();
Запись в файл
При программировании на C ++ вы записываете информацию в файл из своей программы с помощью оператора вставки потока (<<) точно так же, как вы используете этот оператор для вывода информации на экран. Единственная разница в том, что вы используетеofstream или же fstream объект вместо cout объект.
Чтение из файла
Вы считываете информацию из файла в свою программу, используя оператор извлечения потока (>>), точно так же, как вы используете этот оператор для ввода информации с клавиатуры. Единственная разница в том, что вы используетеifstream или же fstream объект вместо cin объект.
Пример чтения и записи
Ниже приводится программа на 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 () для чтения строки извне и функция ignore () для игнорирования лишних символов, оставленных предыдущим оператором чтения.
Указатели положения файла
И то и другое istream а также ostreamпредоставить функции-члены для изменения положения указателя позиции файла. Эти функции-членыseekg ("seek get") для istream и seekp ("seek put") вместо ostream.
Обычно аргумент seekg и seekp - длинное целое число. Второй аргумент может быть указан для указания направления поиска. Направление поиска может бытьios::beg (по умолчанию) для позиционирования относительно начала потока, ios::cur для позиционирования относительно текущей позиции в потоке или ios::end для позиционирования относительно конца потока.
Указатель позиции файла - это целочисленное значение, которое указывает местоположение в файле в виде количества байтов от его начального местоположения. Вот некоторые примеры размещения указателя позиции файла "get":
// 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 );