Текстовые и бинарные файлы
Закрытие файла
Чтение и запись данных текстовых файлов
Запись и чтение значений элементов матрицы
Результат выполнения
Функции чтения и записи символов в бинарных файлах
Считывание символов из файла и вывод их на экран
Считывание и запись в файл блоков данных
Функции для работы с файловыми потоками
Произвольный доступ
Пример совместного использования текстовых и бинарных файлов
Местоположение исходного текстового файла
447.50K
Категория: ПрограммированиеПрограммирование

Текстовые и бинарные файлы

1. Текстовые и бинарные файлы

2.

Поток - это общий последовательный логический
интерфейс с различными устройствами, входящими в
состав компьютера (дисплей, клавиатура, принтер, жесткий
диск и др.).
Поток– это логический интерфейс, который связан с
файлом, в том числе и с физическим файлом,
размещаемом или размещенном в дисковом пространстве
компьютера (жестком диске).
Текущая позиция
или указатель
потока (файла)– это
Файловый
место в потоке
поток
(файле), с которого
будут выполняться
следующие
операции доступа к
Бинарный
Текстовый
компонентам потока
(двоичный)

3.

#include <fstream>
Три файловых потока:
ifstream – входной поток. Используется
только для чтения информации из файла
ofstream – выходной поток. Используется
только для вывода информации в файл
fstream – двунаправленный поток.
Используется для чтения и записи в файл.

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

Открытие файла
fstream file;
file.open(“text”, ios::binary || ios::in || ios::out);
Проверка открытия файла:
if(!file) cout<<” Не удается открыть файл”;
return 1;
Закрытие файла
file.close();

5.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
setlocale(LC_CTYPE,"Russian");
cout<<"input name>";
char name[25]="";
gets(name);
fstream file;
file.open(name);
if(!file){cout<<"Файл "<<name<<" не открыт"<<endl;
return 1;}
file.close();
return 0;
}

6. Чтение и запись данных текстовых файлов

int x;
ifstream in;
ofstream out;
in>>x;
out<<x;

7. Запись и чтение значений элементов матрицы

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
int main()
{
cout<<"input name>";
char name[25]="";// определение переменной для имени файла
gets(name); // ввод имени файла с клавиатуры
ifstream in; // описание входного файлового потока
ofstream out; // описание выходного файлового потока
out.open(name);// открытие файла с именем name

8.

if(!out){cout<<"Файл для записи "<<name<<" не открыт"<<endl;
return 1;}
// если файл не был открыт выход из программы
int matr[5][5];
// описание матрицы
// формирование матрицы
for(int i=0; i<5; i++)
{
for(int j=0;j<5;j++)
{
matr[i][j]=rand()/1000-100;
// запись элемента матрицы i,j в файловый поток
out<<setw(6)<<matr[i][j];
}
out<<endl;// запись в файл возврат каретки и
переход на сл. строку
}
out.close(); // закрытие файлового потока

9.

in.open(name);// открытие файлового потока для чтения
if(!in){cout<<"Файл для чтения"<<name<<" не
открыт"<<endl; return 1;}
int matr1[5][5];
// описание матрицы
//формирование матрицы
for(int i=0; i<5; i++)
{
for(int j=0;j<5;j++)
{
in>>matr1[i][j];
cout<<setw(6)<<matr1[i][j];
}
cout<<endl;
}
in.close();// закрытие входного файлового потока
return 0;
}

10. Результат выполнения

11.

Пример. Определить количество строк текстового
файла, в котором первая и последняя буквы
одинаковы
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <clocale>
using namespace std;
int main()
{
setlocale(LC_CTYPE,"Russian");
char name[25];
cout<<"Введите имя файла >";gets(name);
ifstream in (name);

12.

if(!in) {
cout<<“файл для чтения не открыт "<<endl;
return 1;
}
char str[255];int k=0;
while(!in.eof())
{
in.getline(str,255);
cout<<str<<endl;
if(str[0]==str[strlen(str)-1])k++;
}
if(k!=0)cout<<"Количество строк начинающихся и
заканчивающихся одной и той же буквой = "<<k<<endl;
else cout<<"Cтрок начинающихся и заканчивающихся
одной и той же буквой нет "<<endl;
return 0;
}

13.

14. Функции чтения и записи символов в бинарных файлах

Прототипы функций:
istream &get(char &ch);
ostream &put(char ch);
Функция get() считывает из файлового потока символ
и помещает его в переменную ch.
Функция put() записывает значение переменной ch в
файловый поток.

15. Считывание символов из файла и вывод их на экран

Исходный файл с данными:

16.

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
int main()
{
setlocale(LC_CTYPE,"Russian");
cout<<"input name>";
char name[25]="";
gets(name);
ifstream in;
in.open(name, ios::binary);// открытие двоичного файла
if(!in){cout<<"Файл для чтения"<<name<<" не
открыт"<<endl;
return 1;}

17.

char a;
while(!in.eof())
{
in.get(a);
cout<<a;
}
cout<<endl;
in.close();
return 0;
}

18.

19. Считывание и запись в файл блоков данных

Прототипы функций:
istream &read(char *buf, streamsize num);
-считывает num байт данных из
связанного с файлом потока в буфер buf
ostream &write(const char *buf, streamsize
num);
записывает num байт данных в
связанный с файлом поток из буфера buf

20.

Пример
struct Tutors
{
char name[25];
int years;
char step[10];
int stag;
};
В первой части программы запишем в файл данные,
соответствующие данной структуре, а во второй
части программы считаем данные из файла и
выведем их на экран.

21.

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
struct Tutors
{
char name[25];
int years;
char step[10];
int stag;
};

22.

Tutors t[10]={
"Ivanov",25,"ktn",3,
"Petrov",45,"no",20,
"Sidorov",35,"ktn",6,
"Kulikov",58,"dtn",30,
"Sokolova",45,"ktn",22,
"Drobysheva",43,"no",10,
"Golova",50,"ktn",28,
"Balabanov",60,"ktn",35,
"Ezdakov",39,"no",17,
"Asharina",45,"ktn",18
};

23.

int main()
{
setlocale(LC_CTYPE,"Russian");
cout<<"input name>";
char name[25]="";
gets(name);
ofstream out;
out.open(name, ios::binary);
if(!out){cout<<"файл для записи "<<name<<" не
открыт"<<endl; return 1;}
out.write((char* ) &t, sizeof t);
out.close();
ifstream in;
in.open(name, ios::binary);
if(!in){cout<<"файл для чтения "<<name<<" не
открыт"<<endl; return 1;}

24.

Tutors a;
in.read((char* ) &a,sizeof a);
cout<<setw(26)<<"Name|"<<setw(9)<<"Vozrast|"<<set
w(9)<<"Stepen|"<<setw(7) <<"Stag|"<<endl;
for(int i=0;i<10;i++)
{
cout<<setw(51)<<"___________________________"<<endl;
cout<<setw(25)<<a.name<<"|"<<setw(8)<<a.years<<"|"<<set
w(8)<< a.step<<"|"<<setw(6)<<a.stag<<"|";
cout<<endl;
}
in.close();
return 0;
}

25.

26. Функции для работы с файловыми потоками

istream &get(char *buf, streamsize num);
считывание символов в массив buf до тех пор, пока не
будет считано num-1 символов, или не встретится
символ новой строки или символ конца файла.
После выполнения функции в массив buf будет
добавлен символ конца строки (\0).

27.

istream &get(char *buf, streamsize num, char delim);
считывание символов в массив buf до тех пор, пока не
будет считано num-1 символов, или не встретится
символ заданный параметром delim , или символ
конца файла. После выполнения функции в массив buf
будет добавлен символ конца строки (\0). Символ,
заданный delim в массив buf не записывается, он
остается во входном потоке до следующей операции
ввода.

28.

int get();
возвращает из потока следующий символ.
sreamsize gcount();
возвращает количество символов, считанных при
выполнении последней операции ввода.
istream &getline(char *buf, streamsize num);
считывание символов в массив buf до тех пор, пока не
будет считано num-1 символов, или не встретится
символ новой строки или символ конца файла. После
выполнения функции в массив buf будет добавлен
символ конца строки (\0). Если встретится символ
новой строки, то он в buf не помещается, а из
входного потока извлекается

29.

istream &getline(char *buf, streamsize num, char
delim);
считывание символов в массив buf до тех пор, пока
не будет считано num-1 символов, или не
встретиться символ заданный параметром delim ,
или символ конца файла. После выполнения
функции в массив buf будет добавлен символ
конца строки (\0). Символ, заданный delim в
массив buf не записывается, но извлекается из
входного потока
int peek();
считывает следующий символ из входного потока,
но не удаляет его из него

30.

istream &putback (char c);
возвращает последний считанный символ из потока
в него.
ostream &flush();
немедленно перезаписывает содержимое буферов
на жесткий диск, не дожидаясь их (буферов)
заполнения. Как правило, информация
накапливается во внутреннем буфере. Пока буфер
не будет полностью заполнен информация на диск
не переносится. Эта операция позволяет
немедленно переписать данные на диск.

31. Произвольный доступ

Только для бинарных файлов
Указатель get – указывает на позицию файла
при вводе данных
Указатель put – на позицию файла при выводе
данных.

32.

Прототипы функций:
istream &seekg( off_type offset, seekdir origin);
перемещает текущий get-указатель на offset байт
относительно позиции, заданной origin.
istream &seekp( off_type offset, seekdir origin);
перемещает текущий put-указатель на offset байт
относительно позиции, заданной origin.

33.

istream &seekg( off_type offset, seekdir origin);
off_type - это целочисленный тип,
позволяющий хранить самое большое
значение, которое может принимать параметр
offset.
Тип seekdir – это перечисление, принимающее
следующие значения:
ios::beg начало файла
ios::cur
текущая позиция
ios::end конец файла

34.

Пример. Написать программу, которая создает бинарный файл
из случайных чисел и сортирует их в порядке убывания.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <clocale>
#include <conio.h>
#include <string>
#include <time.h>
using namespace std;
const int n=25;
// количество элементов массива

35.

void out_file(fstream &f, int n);// функция вывода значений
int main()
{
setlocale(LC_CTYPE,"Russian");// установка русского языка для
//вывода на экран
srand((unsigned)time(NULL));// инициализация датчика сл.чисел
ofstream out;// описание файлового потока
cout<<"Введите имя файла >";
char name[n];
gets(name); // ввод имени файла
out.open(name,ios::binary | ios::out);// открытие файла
if(!out){cout<<"Файл для записи "<<name<<" не
открыт"<<endl;return 1;}

36.

//запись в файл сл.чисел
for(int i=0;i<n;i++)
{
int a=rand()/100-100;
out.put((char)a);
}
out.close();// закрытие файла
fstream file; // описание файлового потока
file.open(name,ios::binary | ios::out |ios::in);
//открытие файла
if(!file){cout<<"Файл для чтения записи
"<<name<<" не открыт"<<endl;return 1;}

37.

cout<<"Файл до сортировки"<<endl;
out_file(file,n);// вывод содержимого файла на экран
// сортировка файла
char max,b;
int n_max;
for(int i=0;i<n;i++)
{
file.seekg(i);
file.get(max);
n_max=i;
for(int j=i+1;j<n;j++)
{
file.get(b);
if(b>max)
{
max=b;
n_max=j;
}
}

38.

file.seekg(i);
file.get(b);
file.seekp(i);
file.put(max);
file.seekp(n_max);
file.put(b);
}
cout<<"Файл после сортировки"<<endl;
out_file(file,n);
}

39.

void out_file(fstream &f, int n)// функция вывода значений
//массива на экран
{
f.seekg(0);// установка указателя на начало
char a;
for(int i=0;i<n;i++)
{
f.get(a);// чтение значения из файла
cout<<(int)a<<" ";// вывод на экран
}
cout<<endl;
}

40.

41. Пример совместного использования текстовых и бинарных файлов

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

42.

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <clocale>
using namespace std;
// структура Преподаватели
struct Tutors
{
char name[25];
int years;
char step[10];
int stag;
};

43.

// функция вывода на экран содержимого файла
void outfile(fstream& f, int n)
{
Tutors a;
f.seekg(0);// установить указатель файла на начало
cout<<setw(26)<<"Имя|"<<setw(9)<<"Возраст|"<<setw(9)<
<"Степень|"<<setw(7)<<"Стаж|"<<endl;
cout<<setw(51)<<"__________________________"<<endl;
for(int i=0; i<n; i++)
{
f.read((char *)&a,sizeof a);// чтение из файла
сout<<setw(25)<<
a.name<<"|"<<setw(8)<<a.years<<"|"<<setw(8)<<a.step<<"|"<<set
w(6)<<a.stag<<"|";
cout<<endl;
}
}

44.

// функция чтения данных из текстового файла и
запись данных в бинарный файл
int read_f(fstream &f, fstream &out)
{
int i=0;Tutors a;
while(!f.eof())// пока не конец файла
{
f>>a.name>>a.years;f>>a.step;f>>a.stag;
out.write((char *) &a, sizeof a);
i++;
}
return i;
}

45.

// функция сортировки компонентов бинарного файла в алфавитном
порядке
void sort(fstream &f,int n)
{
Tutors min,a;
int n_min;
for(int i=0;i<n;i++)
{
f.seekg(i*(sizeof a));
f.read((char *)&min,sizeof min);
n_min=i;
for(int j=i+1;j<n;j++)
{
f.read((char *)&a,sizeof a);
if(strcmp(a.name,min.name)<0)
{
min=a;
n_min=j;
}
}

46.

f.seekg(i*(sizeof a));
f.read((char *) &a,sizeof a);
f.seekp(i*(sizeof a));
f.write((char *) &min,sizeof min);
f.seekp(n_min*(sizeof a));
f.write((char *) &a,sizeof a);
}
}

47.

// функция формирования нового файла из данных
попадающих в заданный интервал
int IsYears(fstream &f,fstream &f_new,int n,int c, int d)
{
int k=0;
Tutors a;
f.seekg(0);f_new.seekp(0);
for(int i=0;i<n;i++)
{
f.read((char *) &a,sizeof a);
if(a.years>=c && a.years<=d)
{
k++;
f_new.write((char *) &a, sizeof a);
}
}
return k;
}

48.

// функция формирования нового файла из данных, в которых
стаж больше с
int IsStag(fstream &f,fstream &f_new,int n,int c)
{
int k=0;
Tutors a;
f.seekg(0);f_new.seekp(0);
for(int i=0;i<n;i++)
{
f.read((char *) &a, sizeof a);
if(a.stag>=c )
{
k++;
f_new.write((char *) &a,sizeof a);
}
}
return k; }

49.

int main()
{
setlocale(LC_CTYPE,"Russian");
fstream in ("data.txt", ios::in);
if(!in)
{
cout<<"не открыт data.txt"<<endl;
return 1;
}
fstream out ("data.dat", ios::out | ios::binary);
if(!out)
{
cout<<"не открыт data.dat"<<endl;
return 1;
}

50.

int size_f=read_f(in,out);
in.close();out.close();
fstream out_f ("data.dat", ios::in | ios::out |
ios::binary);
if(!out_f)
{
cout<<"не открыт data.dat"<<endl;
return 1;
}
sort(out_f,size_f);
outfile(out_f,size_f);

51.

fstream out_f1 ("d.dat", ios::in | ios::out |
ios::binary);
if(!out_f1)
{
cout<<"не открыт data1.dat"<<endl;
return 1;
}
cout<<"Введите через пробел возрастной
интервал >";
int c,d;
cin>>c; cin>>d;
outfile(out_f1,IsYears(out_f,out_f1,size_f,c,d));
cout<<"Введите стаж>";

52.

cin>>c;
outfile(out_f1,IsStag(out_f,out_f1,size_f,c));
out_f.close();out_f1.close();
return 0;
}

53. Местоположение исходного текстового файла

English     Русский Правила