Работа с двоичными файлами
Файлы по принципам работы делятся на:
Текстовые файлы
Бинарные (двоичные) файлы Интерпретация таких файлов возлагается на специализированные программные средства
Двоичные файлы
Открытие двоичного файла для чтения :
Открытие двоичного файла для записи:
Режимы открытия двоичного файла в языке Си:
Пример:
Режимы открытия двоичного файла в языке С++:
Запись в двоичный файл осуществляется по одной компоненте:
Чтение из двоичного файла
Можно считывать двоичный файл последовательно:
Режим прямого доступа для двоичных файлов
Чтение компоненты с заданным номером:
Запись данных с заданной позиции:
Работа с двоичным файлом
Открытие файла структур:
Чтение и выборка данных:
Задача 1
Математическая формулировка:
Алгоритм
Текст программы:
Окончание программы:
Задача 2
Алгоритм
Текст программы:
Домашнее задание задача
1.27M
Категория: ПрограммированиеПрограммирование

Работа с двоичными файлами. ТЕМА 13

1. Работа с двоичными файлами

С++

2. Файлы по принципам работы делятся на:

Текстовые
Двоичные

3. Текстовые файлы

Позволяют
обрабатывать
информацию
последовательно, от начала до конца
Новую информацию можно добавлять
только в конец файла (или перезаписать
файл полностью)
Содержимое файла можно отредактировать
в текстовом редакторе

4. Бинарные (двоичные) файлы Интерпретация таких файлов возлагается на специализированные программные средства

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

5. Двоичные файлы

Имеют расширения dat, bin, db
Обрабатываются по компонентам
Имеют как последовательный, так и
прямой доступ к компонентам
Компонентами файла являются данные
определенного типа
На каждую компоненту выделяется
определенное
количество
байт

соответствие с типом)
Первая компонента следует с нулевого
байта от начала файла

6. Открытие двоичного файла для чтения :

ifstream fs;
fs.open("file.dat", ios::binary | ios::in |
ios::nocreate );
if (!fs) {
cout<<"Ошибка открытия файла!";
return 1;
}
Эта команда «перематывает» файл в начало
Указатель файла устанавливается на начало
файла
Если файл не найден, возникает исключение
(ошибка выполнения)

7. Открытие двоичного файла для записи:

ofstream fs;
fs.open("file.dat", ios::binary);
Эта команда «перематывает» файл в
начало со стиранием информации
Указатель файла устанавливается на
начало файла
Если файл не был создан, то он создается

8. Режимы открытия двоичного файла в языке Си:

Чтения (режим rb)
Запись (режим wb)
Чтения и записи (режим r+b)
Записи и чтения (режим w+b)

9. Пример:

FILE *f1;
f1 = fopen("file1.bin","rb");
с проверкой открытия:
FILE *f1;
if ((f1 = fopen("file1.bin","rb"))==NULL)
{
printf("Ошибка открытия файла!");
return 1;
}

10. Режимы открытия двоичного файла в языке С++:

Чтения (ios::in)
Запись (ios::out)
Чтения и записи (ios::in | ios::out)
Записи и чтения (ios::out| ios::in)

11. Запись в двоичный файл осуществляется по одной компоненте:

ofstream fs;
fs.open("file.dat", ios::binary | ios::out);
temp = rand() % 700 - 200;
fs.write(&temp, sizeof(int));
Значение переменной temp записывается в файл
вместо компоненты, на которую настроен указатель
файла;
Указатель файла передвигается на следующую
компоненту.

12. Чтение из двоичного файла

Осуществляется по одной компоненте:
ifstream ifs;
ifs.open("file.dat", ios::binary |
ios::in);
ifs.read((char *)&temp, sizeof(int));
Одна компонента (на которую настроен
указатель файла) считывается в переменную
temp;
Указатель файла передвигается на следующую
компоненту.

13. Можно считывать двоичный файл последовательно:

ifstream ifs;
ifs.open("file.dat", ios::binary | ios::in);
while (!ifs.eof())
{
ifs.read((char *)&temp, sizeof(int));
cout<<temp<<'\t';
}
ifs.close();

14. Режим прямого доступа для двоичных файлов

fs.fseek(n*sizeof(x), fs.beg);
n – номер компоненты, на которую
надо настроить указатель файла
fs.fseek(0, fs.end);

15. Чтение компоненты с заданным номером:

int i, temp;
ifstream ifs;
ifs.open("file.dat", ios::binary |
ios::in | ios::out );
cin>>i;
ifs.seekp(i * sizeof(int), ifs.beg);
ifs.read((char *)&temp, sizeof(int));
cout<<temp;

16. Запись данных с заданной позиции:

int i, temp = 100;
ifstream ifs;
ifs.open("file.dat", ios::binary |
ios::in | ios::out );
cin>>i;
ifs.seekp(i * sizeof(int), ifs.beg);
ifs.write((char *)&temp, sizeof(int));
cout<<temp;

17. Работа с двоичным файлом

1. Открытие файла для записи, создание
2.
3.
4.
5.
6.
файла в программе
Запись в файл компонент определённого
типа
Закрытие файла (сохранение)
Открытие файла для чтения (либо чтения
и записи)
Чтение информации из файла в режиме
последовательного или прямого доступа,
поиск и выборка данных
Может
быть
запись
измененной
информации в любое место файла

18. Открытие файла структур:

struct Tovar
{ char name[40];
float pay;
}
void main()
{
ifstream fs;
fs.open("file.dat", ios::binary |
ios::in | ios::nocreate );
if (!fs) {
cout<<"Ошибка открытия файла!";
return 1;
}

19. Чтение и выборка данных:

Tovar T = new Tovar();
while (! fs.eof())
{
ifs.read((char *)&T, sizeof(T));
if (T.pay > 30 000)
cout<<T.name;
}
fs.close();
system("pause");
}

20. Задача 1

Заполнить бинарный файл случайными
целыми
числами.
Подсчитать
количество четных по значениям чисел
и какой процент они составляют от
общего количества компонент.

21. Математическая формулировка:

Необходимо открыть исходный файл
для записи и заполнить его целыми
числами при помощи генератора
случайных чисел.
Затем открыть файл для чтения и
считывая его компоненты в цикле,
проверять их на четность.
После выхода из цикла, зная
количество четных чисел, найти
процент, который они составляют.

22. Алгоритм

Начало
Открытие
файла F
для записи
1
Цикл 1
i:=0 to 19
Цикл 2
! feof(F)
X=rand()%100
-50
Чтение из
файла F
числа X
Запись в
файл F
числа X
X-четное
Вывод на
экран числа
X
да
нет
Конец
цикла 2
Конец
цикла 1
P:=(k/20)*100
Открытие
файла F
для чтения
Алгоритм
k:=0
Вывод на
экран
P
1
Закрытие
файла
F
Конец
k:=k+1

23. Текст программы:

void main()
{
srand(time(NULL));
int x;
ofstream F;
F.open("file.dat", ios::binary);
for (int i=0; i<20; i++)
{
x = rand() % 100 - 50;
F.write(&x, sizeof(int));
cout<<x;
}
F.close();

24. Окончание программы:

int k = 0;
ifstream F1;
F1.open("file.dat", ios::binary | ios::in |
ios::out );
while (! F1.eof())
{
F1.read((char *)&x, sizeof(int));
if (x%2 == 0) k++;
}
float P = (float) k/20 * 100;
cout<<"Процент "<<P;
F1.close();
}

25. Задача 2

Заполнить бинарный файл числами,
вводимыми с клавиатуры. Количество
компонент файла задать по желанию
пользователя.
Удвоить компоненты файла с четными
номерами.
Вывести на экран ещё раз содержимое
файла.

26. Алгоритм

Начало
1
Подготовка
к записи
файла F2
Цикл 2
i:=0 to n-1
Ввод
n
Чтение из
файла F2
числа Y
Вывод
«Введите
числа»
Цикл 1
i:=0 to n-1
да
i-четное
Y:=Y*2
Запись числа
Y
в файл F2
Вывод на
экран числа
Y
Конец
цикла 1
Подготовка к
чтению
файла F2
1
Установить
указатель
файла F2
на номер i
нет
Ввод
Y
Запись в
файл F2
числа Y
Алгоритм
Конец
цикла 2
Закрытие
файла
F2
Конец

27. Текст программы:

void main()
{
int y, n;
ofstream F1;
F1.open("file.dat", ios::binary);
cout<<"Введите кол-во чисел:";
cin>>n;
for (int i=0; i<n; i++)
{
cin>>y;
F1.write(&y, sizeof(int));
}
F1.close();

28.

ifstream F2;
F2.open("file.dat", ios::binary | ios::in |
ios::out );
for (int i=0; i<n; i++)
{
F2.read((char *)&y, sizeof(int));
if (y%2 == 0)
{
y *= 2;
F2.seekp(i * sizeof(int), F2.beg);
F2.write((char *)&y, sizeof(int));
}
}
F2.close();
}

29. Домашнее задание задача

• Заполнить
файл
целыми
числами,
вводимыми с клавиатуры, окончание работы
- ввод числа 0.
• Вычислить
сумму
положительных
компонент,
стоящих
после
первого
отрицательного значения.
• Полученную сумму записать вместо первой
отрицательной компоненты.
English     Русский Правила