ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4225
Скачиваний: 28
Часть IV. Стандартная библиотека языка программирования С++
506
Второй конструктор также создает буфер потока посредством
вызова конструктора
basic_filebuf<E, T>()
, а затем открывает
файл, на имя которого указывает параметр
s
, в режиме
mode|ios_base::in
. Возможные режимы открытия файла описаны
в
разд. 40.2.1.3
. Если открытие файла закончилось неудачей, то
конструктор вызывает функцию
setstate(failbit)
.
Функции-члены шаблона класса
basic_ifstream<E, T>
выполняют
следующие действия:
rdbuf
— возвращает адрес буфера потока;
open
— открывает файл, на имя которого указывает параметр
s
,
в режиме
mode|ios_base::in
. Если открытие файла закончи-
лось неудачей, то вызывает функцию
setstate(failbit)
;
is_open
— возвращает значение
true
, если файл открыт, ина-
че —
false
;
close
— закрывает файл. Если файл успешно закрыт, то воз-
вращает указатель
this
, иначе — пустой указатель.
40.6.3. Шаблон класса
basic_fstream
Шаблон класса
basic_fstream<E, T>
имеет следующий интер-
фейс:
template <class E, class T = char_traits<E>>
class basic_fstream : public basic_iostream<E, T>
{
public:
basic_fstream();
explicit basic_fstream(const char *s,
ios_base::openmode mode = ios_base::in|ios_base::out);
basic_filebuf<E, T> *rdbuf() const;
void open(const char *s,
ios_base::openmode mode = ios_base::in|ios_base::out);
bool is_open() const;
void close();
};
Глава 40. Потоки ввода/вывода в C++
507
Параметр
E
шаблона задает тип символов, которые являются эле-
ментами потока, а параметр
T
определяет характеристики этих
символов. Подробно характеристики символов описаны в
разд. 39.1
.
Конструктор по умолчанию создает буфер потока посредством
вызова конструктора
basic_filebuf<E, T>()
, а затем вызывает
конструктор базового класса
basic_ostream<E, T>
, передавая ему,
в качестве аргумента, указатель на буфер потока.
Второй конструктор также создает буфер потока посредством
вызова конструктора
basic_filebuf<E, T>()
, а затем открывает
файл, на имя которого указывает параметр
s
, в режиме
mode
. Воз-
можные режимы открытия файла описаны в
разд. 40.2.1.3
. Если
открытие файла закончилось неудачей, то конструктор вызывает
функцию
setstate(failbit)
.
Функции-члены шаблона класса
basic_ifstream<E, T>
выполняют
следующие действия:
rdbuf
— возвращает адрес буфера потока;
open
— открывает файл, на имя которого указывает параметр
s
,
в режиме
mode
. Если открытие файла закончилось неудачей, то
вызывает функцию
setstate(failbit)
;
is_open
— возвращает значение
true
, если файл открыт, ина-
че —
false
;
close
— закрывает файл. Если файл успешно закрыт, то воз-
вращает указатель
this
, иначе — пустой указатель.
40.6.4. Работа с текстовыми файлами
Под текстовыми файлами понимают файлы, в которых хранится
текстовая информация, т. е. каждый символ такого файла являет-
ся алфавитно-цифровым, специальным или управляющим симво-
лом. При работе с текстовыми файлами в языке программирова-
ния C++ нужно использовать перегруженные операторы ввода
>>
и вывода
<<
, которые выполняют форматированный ввод/вывод
данных в поток.
Часть IV. Стандартная библиотека языка программирования С++
508
40.6.4.1. Создание текстового файла
Пример создания текстового файла приведен в листинге 40.11.
Листинг 40.11. Создание текстового файла
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream out;
out.open("test.txt");
out << "Integer: " << 10 << endl;
out << "Double: " << 20.5 << endl;
out << "String: " << "This is a string." << endl;
out.close();
return 0;
}
40.6.4.2. Чтение текстового файла
Пример чтения текстового файла приведен в листинге 40.12.
Листинг 40.12. Чтение текстового файла
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in;
char buf[80];
in.open("test.txt");
if (!in.is_open())
Глава 40. Потоки ввода/вывода в C++
509
{
cerr << "Open file failed." << endl;
return 0;
}
while (!in.eof())
{
in.getline(buf, 80);
cout << buf << endl;
}
in.close();
return 0;
}
При чтении текстового файла может возникнуть следующий во-
прос: какую длину буфера выбрать для хранения строки? Обычно
длина буфера выбирается равной длине строки на устройстве вы-
вода или из других ограничений, обусловленных реализацией.
В конце концов, длину буфера можно выбрать равной длине файла.
40.6.4.3. Модификация текстового файла
Следует понимать, что текстовые файлы — это файлы
последо-
вательного
доступа, т. е. содержимое файлов читается последо-
вательно слово за словом. Поэтому для модификации текстового
файла нужно содержимое этого файла переписать в другой файл,
внося по ходу нужные изменения.
40.6.5. Работа с бинарными файлами
Под бинарными файлами понимаются файлы, в которых хранятся
бинарные данные, т. е. данные, представленные двоичными ко-
дами. Такие файлы обычно хранят набор записей, каждая из ко-
торых является копией содержимого структуры, определенной в
прикладной программе. При работе с бинарными файлами в язы-
ке программирования C++ нужно придерживаться следующих
двух правил:
поток, связанный с бинарным файлом, должен быть открыт
в бинарном режиме;
Часть IV. Стандартная библиотека языка программирования С++
510
для доступа к данным, хранящимся в бинарном файле, нужно
использовать не форматирующие операции ввода/вывода.
40.6.5.1. Создание бинарного файла
Пример создания бинарного файла приведен в листинге 40.13.
Листинг 40.13. Создание бинарного файла
#include <iostream>
#include <fstream>
using namespace std;
struct emp
{
int code;
char name[20];
double salary;
};
int main()
{
ofstream out; // выходной поток
struct emp s; // для записей файла
int n;
// открываем выходной поток в бинарном режиме
out.open("demo.bin", ofstream::binary);
cout << "Input a number of records: ";
cin >> n;
cout << "Input code, name and salary." << endl;
for (int i = 0; i < n; ++i)
{
cout << '>';
// вводим следующие записи с консоли
cin >> s.code >> s.name >> s.salary;
// пишем запись в файл
out.write((const char*)&s, sizeof(struct emp));
}