702.56K
Category: programmingprogramming

16. Файловый ввод-вывод

1.

Файловый ввод-вывод
данных

2.

Файлы
Текстовые
(последовательного
доступа)
Элементы – строки
произвольной длины
Двоичные
(произвольного
доступа)
Элементы – однотипные
компоненты
Текстовые файлы организованы вокруг строк, каждая из которых заканчивается
символом новой строки (‘\n’)
2

3.

Файлы
Текстовый файл
Двоичный файл
Двоичные файлы не могут быть легко перенесены из
одной компьютерной системы в другую из-за различий
во внутреннем представлении.
Он хранит данные в формате ASCII, т.е. в
Он хранит данные в двоичном формате, т.е. с помощью
удобочитаемых графических символах.
0 и 1.
Эти файлы легко читаются и модифицируются, потому Эти файлы нелегко читать и модифицировать, потому
что содержимое, записанное в текстовых файлах,
что содержимое, записанное в двоичных файлах, не
удобочитаемо для человека.
читается человеком и является зашифрованным
содержимым.
Текстовые файлы сохраняют данные, преобразуя
Они экономят память, потому что данные любого типа
каждую цифру данных в формат ASCII, который займет будут храниться в памяти в соответствии с размером
много места по сравнению с требуемым.
памяти.
Любой файл по умолчанию является текстовым
Режим ios::binary должен использоваться с бинарными
файлом.
файлами при их открытии.
Ошибку в текстовом файле можно легко распознать и Ошибка в двоичном файле повреждает файл и ее
устранить.
нелегко обнаружить.
В текстовом файле специальный символ с кодом ASCII
В двоичном файле нет такого специального символа,
26 вставляется в конец файла. Этот символ
который бы сигнализировал о завершении операции.
сигнализирует программе EOF при встрече.
Текстовые файлы могут быть легко перенесены из
одной компьютерной системы в другую.
3

4.

Библиотека fstream
Библиотека определяет классы ifstream и ofstream (входной поток
и выходной поток).
Для открытия и закрытия файла используются методы файловых
классов.
4

5.

ВЫВОД В ФАЙЛОВЫЙ ПОТОК
ofstream file_object("FILENAME.EXT");
Если вы указываете имя файла при объявлении объекта типа ofstream,
C++ создаст новый файл на вашем диске, используя указанное имя,
или перезапишет файл с таким же именем, если он уже
существует.
5

6.

ВЫВОД В ФАЙЛОВЫЙ ПОТОК в
текстовом файле
Используя выходной файловый поток, можно писать информацию в файл
с помощью оператора вставки (<<).
#include <fstream>
int main()
{
ofstream book_file("1.DAT");
book_file << "первая строка " << endl;
book_file << "вторая строка" << endl;
book_file << "третья строка" << endl;
}
6

7.

ЧТЕНИЕ ИЗ ВХОДНОГО
ФАЙЛОВОГО ПОТОКА
ifstream input_file("filename.ТXT");
Откроет файл для чтения, если он существует, или произойдет
ошибка, если нет.
Используя входной файловый поток, можно читать хранимую в
файле информацию с помощью оператора извлечения (>>).
Если надо считать всю строку целиком, то лучше использовать
встроенную функцию getline(), которая принимает поток для чтения и
переменную, в которую надо считать текст:
getline(имя файла, переменная)
7

8.

ЧТЕНИЕ ИЗ текстового
файла
ifstream input_file("filename.ТXT");
#include <iostream>
#include <fstream>
int main()
{
ifstream input_file("1.DAT") ;
char one[64], two[64], three[64];
input_file >> one;
input_file >> two;
input_file >> three;
cout << one << endl;
cout << two << endl;
cout << three << endl;
}
8

9.

ОПРЕДЕЛЕНИЕ КОНЦА
ФАЙЛА
eоf()
Эта функция возвращает значение 0, если конец файла еще не
встретился, и 1, если встретился конец файла.
while (! input_file.eof())
{
// Операторы
}
В данном случае программа будет продолжать выполнять цикл,
пока функция eof возвращает ложь (0).
9

10.

ПРОВЕРКА ОШИБОК ПРИ
ВЫПОЛНЕНИИ ФАЙЛОВЫХ
ОПЕРАЦИЙ
Функция fail()
Если в процессе файловой операции ошибок не было, функция
возвратит ложь (0). Если встретилась ошибка, функция fail возвратит
истину.
ifstream input_file("FILENAME.DAT");
if (input_file.fail())
{
cerr << "Ошибка открытия FILENAME.EXT" << endl;
exit(1);
}
Аналог - функция is_open()
10

11.

ЗАКРЫТИЕ ФАЙЛА, ЕСЛИ ОН
БОЛЬШЕ НЕ НУЖЕН
input_file.close ();
11

12.

УПРАВЛЕНИЕ ОТКРЫТИЕМ ФАЙЛА
ifstream output_file("FILENAME.EXT", ios::режим);
Режим открытия Назначение
ios::app
Открывает файл в режиме добавления, располагая
файловый указатель в конце файла.
ios::ate
Располагает файловый указатель в конце файла.
ios::in
Указывает открыть файл для ввода.
ios::nocreate
Если указанный файл не существует, не создавать
файл и возвратить ошибку.
ios::out
Указывает открыть файл для вывода.
ios::trunc
Сбрасывает (перезаписывает) содержимое из
существующего файла.
12

13.

Пример 1. Соответствие скобок
Дан текстовый файл, содержащий текст программы.
#
Проверить эту программу на соответствие числа открывающих
и закрывающих фигурных скобок и результат вывести в новый
текстовый файл.
13

14.

Пример 1. Соответствие скобок
#
14

15.

Пример 1. Соответствие скобок
#
15

16.

Пример 2. Подсчет количества строк
# Дан текстовый файл, содержащий произвольные
строки. Посчитать количество строк в файле и
дописать результат в конец файла.
16

17.

Пример 2. Подсчет количества строк
#
17

18.

Режимы
Текстовый файл можно одновременно использовать
только в одном из режимов (чтение или запись)
Двоичный файл можно использовать одновременно
в двух режимах.
Если при открытии режим не указан, то по умолчанию
для объектов ofstream применяется режим ios::out, а для
объектов ifstream - режим ios::in.
Для объектов fstream совмещаются режимы ios::out и
ios::in.
18

19.

Доступ к бинарному
файлу:
ifstream- для ввода из файла ;
ofstream- для вывода в файл;
fstream - для обмена с файлом в двух
направлениях.
19

20.

Открытие файла
Открыть (open) для работы в определенном режиме, с обязательным
указанием двоичного режима ios::binary (по умолчанию потоки
открываются в текстовом режиме):
ifstream(имя_файла, режим);
ofstream(имя_файла, режим);
fstream(имя_файла, режим);
где имя_файла – имя файла, в которое может входить спецификатор
пути;
режим – задает режим открытия файла.
20

21.

Запись и чтение
Для записи в поток в C++ используется метод write
Для чтения из потока используется метод read
Произвольный доступ к файлу осуществляется путем
установки текущей позиции в файле с помощью
методов:
для потоков открытых на ввод: seekg(позиция)
для потоков открытых на вывод seekp (позиция)
ios_base::beg
начало файла
ios_base::end
конец файла
ios_base::cur
текущая позиция
21

22.

Запись и чтение
ifstream in(FName1,ios::binary);
ofstream out(FName2,ios::binary);
in.read((char*)&x, sizeof(x));
//перенос байтов из файла в перем. "х"
out.write((char*)&x, sizeof(x));
//перенос байтов из перем. "х” в файл
Когда идет речь о бинарных данных, тип char выступает в роли типа byte. В
компьютерах используется такая модель памяти, где одна ячейка занимает 1 байт. А один
символ char гарантировано должен залезать в эту ячейку.
Чтобы записать какое-нибудь значение в бинарном представлении, нужно для
начала вывести это бинарное представление, а чтобы записалось правильное
количество байт, нужно явно указывать это количество.
Это выглядит следующим образом: (char*)&x
- делаем строку байтов для того,
чтобы отдать потоку, открытому в двоичном режиме, sizeof(x) - ограничиваем число
уходящих в поток байтов нужным числом.
! В зависимости от заявленного типа переменная может занимать от одного до
нескольких байт в памяти компьютера, и при записи переменных нужно внимательно
следить, чтобы указываемое число байт строго совпадало с числом байт, занимаемых
переменной в памяти.
22

23.

Пример. Обмен местами первого и
последнего элементов
23

24.

Пример. Обмен местами первого и
последнего элементов
24

25.

Пример. Обмен местами первого и
последнего элементов
25
English     Русский Rules