Записать блоком write и прочитать блоком read
//arb2014_binary_read_write_2
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
void main()
{
const int n=80;
ifstream in("arb.txt");
ofstream out("out.bin", ios::binary);
if(!in)
{
cout<<"can't open file!";
exit(1);
}
char mch[n];
in.getline(mch,80);
int k=strlen(mch);
in.close();
out.write((char*) mch, k*sizeof(char));
out.close();
ifstream in1("out.bin",ios::binary);
if(!in1)
{
cout<<"can't open file!";
exit(1);
}
ofstream out1("out1.txt");
in1.read((char*)mch, k*sizeof(char));
out1<<mch<<endl;
in1.close();
out1.close();
}
Файл arb.txt
abc def Kazan State University 123 456
Файл out1.txt
abc def Kazan State University 123 456
Считывание и запись в файл блоков данных
Чтобы считывать и записывать в файл блоки двоичных данных, используйте функции-члены read() и write().
Их прототипы имеют следующий вид:
istream &read((char*) buf, streamsize num);
ostream &write((char*) buf, streamsize num);
Функция read() считывает num байт данных из связанного с файлом потока и помещает их в буфер , адресуемый параметром buf.
Функция write() записывает num байт данных в связанный с файлом поток из буфера, адресуемого параметром buf.
Тип streamsiize определен библиотекой С++ как некоторая разновидность целочисленного типа.
При выполнении следующей программы сначала в файл записывается массив целых чисел , а затем он же считывается из файла
//arb2014_binary_array_read_write
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
void main()
{
const int n=5;
int a[n]={1,2,3,4,5};
int i;
ofstream out("out.bin", ios::binary);
if(!out)
{
cout<<"can't open file!";
exit(1);
}
out.write((char*)a, n*sizeof(int));
out.close();
ifstream in("out.bin", ios::binary);
if(!in)
{
cout<<"can't open file!";
exit(1);
}
for(i=0;i<n;i++)
a[i]=0;//очищаем массив
in.read((char*)a, n*sizeof(int));
cout<<"array a:"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
in.close();
}
Задачи из методички Гусенкова А.М.
Задача 2
Создание двоичного (binary) файла целых чисел.
Можно использовать в следующих далее программах
В качестве входного файла.
//arb2014_binary_gus_9_2
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char fname[20]; // // Для ввода имени выходного файла
int x;
cout << "Enter name of file :";
cin >> fname;
// Открытие двоичного файла для вывода.
ofstream out(fname, ios::binary);
if(!out) // // Если не удалось открыть файл
{
cout << "Not open file"<<endl;
exit(1);
}
cout << "Enter integer numbers. Number 9999 - end of input"<<endl;
// Ввод целых чисел с экрана терминала и запись в двоичный
// файл.
// Функция sizeof(int) возвращает количество байт, выделяемых
// для размещения числа типа int/
while(cin>>x && x != 9999)
out.write((char *) &x, sizeof(int));
out.close();
// Открытие созданного двоичного файла для ввода.
ifstream in(fname, ios::binary);
if(!in)
{
cout << "Not open file"<<endl; exit(1);
}
cout << "Output file :"<<endl;
// Чтение двоичного файла и вывод его на экран терминала.
while( in.read((char *) &x, sizeof(int)) )
cout << x << ' ';
cout << endl;
in.close();
}
Задача 3
Задан текстовой файл, состоящий из целых чисел. Используя этот файл , создается бинарный файл целых чисел ”file1.bin”. Используется функция create().
Далее осуществляется проверка на правильное чтение с //помощью функции check().
После этого к полученному бинарному файлу дописывается последовательность целых чисел
из того же текстового файла. И опять проверка на правильность дописывания. Файл открывается для записи и указатель позиции записи устанавливается в конец
файла. Параметр ios::app out1_bin.open("file1.bin",ios::binary | ios::app);
// arb2013_gusen_10_3_bin
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
//////////////////////////
void create(ifstream &f, ofstream &g)
{
int x;
if(!f)
{
cout << "Can not open file file1.bin"<<endl;
exit(1);
}
while(f>>x)
{
g.write((char *) &x, sizeof(int));
}
}
/////////////////////////////////////////
void check(ifstream &f, ofstream &g)
{
int x;
if(!f)
{
cout << "Can not open file file1.bin"<<endl;
exit(1);
}
while(f.read((char*)&x, sizeof(int)))
{
g<<x<<' ';
}
g<<endl;
}
////////////////////////////////////////
void main()
{
ifstream in1("arb.txt");
ofstream out1_bin("file1.bin",ios::binary);
create(in1,out1_bin);
in1.close();
out1_bin.close();
ifstream in1_bin("file1.bin",ios::binary);
ofstream out1("out1.txt");
check(in1_bin,out1);
out1.close();
in1_bin.close();
in1.open("arb.txt");
out1_bin.open("file1.bin",ios::binary | ios::app);
// Файл открывается для записи и указатель позиции
// записи устанавливается
// в конец файла. Параметр ios::app
create(in1,out1_bin);
in1.close();
out1_bin.close();
in1_bin.open("file1.bin",ios::binary);
out1.open("out1.txt");
check(in1_bin,out1);
out1.close();
in1_bin.close();
}
Задача 10.5
/* Расщепление. Образовать из входного файла целых чисел
два новых файла. В один из них поместить все положительные
числа, а в другой – все остальные числа.
*/
// Входной файл можно создать в задаче D2.
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
void main()
{
int x;
ifstream myin("file.bin", ios::binary);
if(!myin)
{
cout << "Can’t open file file1.bin"<<endl;
exit(1);
}
ofstream myout1("file1.bin", ios::binary);
// Файл положительных
ofstream myout2("file2.bin", ios::binary);
// Файл остальных чисел
while(myin.read((char *) &x, sizeof(int)))
{
if(x>0)
myout1.write((char *) &x, sizeof(int));
else
myout2.write((char *) &x, sizeof(int));
}
myout1.close();
myout2.close();
// Вывод созданных файлов на экран терминала
// для проверки результата.
ifstream myplus("file1.bin", ios::binary);
cout << "File of positive numbers"<<endl;
while (myplus.read((char *) &x, sizeof(int)))
cout << x << ' '; cout << endl;
ifstream myother("file2.bin", ios::binary);
cout << "File of other numbers"<<endl;
while(myother.read((char *) &x, sizeof(int)))
cout << x << ' ';
cout <<endl;
myplus.close(); myother.close();
}
Задача 10.6
Дан двоичный файл целых чисел. Вычислить сумму всех его чисел.
Пример чтения чисел в массив. Каждая порция заносится в массив. Входной файл уже создан
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
const int N=5;
int x[N], sum, len, i;
ifstream myin("file.bin", ios::binary); // Входной файл
if(!myin)
{
cout << "Can’t open file file.bin"<<endl;
exit(1);
}
sum = 0;
while(!myin.eof())
// Чтение файла в массив. Указано имя массива (без &)
{
myin.read((char *) x, N*sizeof(int));
// gcount() возвращает количество прочитанных байт.
len = myin.gcount()/sizeof(int);
for(i=0; i<len; i++) sum+=x[i];
}
myin.close();
cout << "Sum =" << sum << endl;
}
Задача 11.3
Описать структуру экзаменационной ведомости, содержащую следующие сведения:
- номер группы;
- наименование предмета;
- дата экзамена;
- фамилия экзаменатора;
- 9 строк с полями: фамилия студента, номер зачетной книжки, отметка о зачете (есть-1, нет-0), оценка по экзамену (2,3,4,5)
Вывести итоговые данные по экзамену (сколько оценок 2,3,4,5)
Пример входного файла:
923 мат.анализ 10.06.2006 Сидоров
Иванов 11111 1 4
Петров 22222 0 2
Сидоров 33333 1 2
Хайруллин 44444 1 5
Карасиков 55555 1 3
Красоткина 66666 1 3
Умнова 77777 1 5
Либерман 88888 1 4
Акзамова 99999 1 4
//arb2014_gus_11_3_december_2014
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
struct student // определение типа student
{
char name[30];
char num_z[6];
int zach;
int mark_exam;
};
struct vedomost // определение типа vedomost
{
int group;
char predmet[15];
char date[10];
char examenater[15];
student spisok[9]; // тип student яв-ся элементом
//типа vedomost
} ;
vedomost subject1; // описание переменной типа vedomost
int i;
int marks[4]; // Cчетчик оценок
ifstream in("vedomost.txt");
if(!in)
{
cout << "Can't open file vedomost.txt"<<endl;
exit(1);
}
// чтение ведомости из файла
in >> subject1.group >> subject1.predmet >> subject1.date >> subject1.examenater;
for(i=0; i<9; i++)
in >> subject1.spisok[i].name >> subject1.spisok[i].num_z
>> subject1.spisok[i].zach >> subject1.spisok[i].mark_exam;
// Обнуление счетчиков
for(i=0; i<4; i++)
marks[i] = 0;
// Подсчет оценок
for(i=0; i<9; i++)
switch (subject1.spisok[i].mark_exam)
{ case 2 :
marks[0]++;
break;
case 3 :
marks[1]++;
break;
case 4 :
marks[2]++;
break;
case 5 :
marks[3]++;
break;
}
ofstream out("out.txt");
out<<" the final performance in the group"<<endl;
out << "marks 5 " << marks[3] <<endl;
out<<"marks 4 " << marks[2]<<endl;
out<< "marks 3 " << marks[1]<<endl;
out<<"marks 2 " << marks[0] << endl;
out.close();
}
Файл out.txt
( перевод итоговая успеваемость в группе )
the final performance in the group
marks 5 2
marks 4 3
marks 3 2
marks 2 2
Задача 11.4
Военно-учетный стол. Регистрация студентов.
Дан текстовый файл, содержащий следующую информацию о студентах:
- Фамилия;
- Номер группы;
- Служба в армии (служил-1 или нет-0);
- Если служил, то воинское звание, иначе – возраст.
1. Создать файл записей
2. На основе файла записей сформировать текстовый файл, содержащий сведения о студентах не служивших в армии. (В виде таблицы.)
Пример входного файла:
Иванов 923 1 солдат
Петров 924 0 19
Сидоров 924 1 мл.лейтенант
Хайруллин 922 1 сержант
Карасиков 924 0 17
Либерман 924 0 25
//arb2014_gus_11_4_december_2014
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
struct student
{
char name[30];
int group;
int army;
union // Аналог записи с вариантами в Pascal
{
char voin_zv[15];
int age;
};
};
student man;
ifstream in("student.txt");
if(!in)
{
cout << "Can't open file student.txt"<<endl;
exit(1);
}
// Создание двоичного файла записей
ofstream binout("voenkomat.bin",ios::binary);
while(!in.eof())
{
in >> man.name >> man.group >> man.army;
if (man.army)
in >> man.voin_zv;
else
in >> man.age;
if(!in.eof())
binout.write((char *) &man,sizeof(struct student));
}
binout.close();
// Чтение файла записей
ifstream binin("voenkomat.bin",ios::binary);
ofstream out("result.txt"); // выходной файл (таблица)
// вывод заголовка
out << " Список студентов не служивших в армии"<<endl<<endl;
// Ввод записей и печать таблицы
while(1)
{
binin.read((char *) &man,sizeof(struct student));
if (binin.eof())
break;
if(!man.army)
{
/* Форматирование для печати таблицы.
width(N) – устанавливает ширину поля вывода равную N.
fill(C) – где С –одиночный символ. Устанавливает символ-заполнитель свободных позиций в поле вывода (по умолчанию – пробел).
setf(ios::left) – устанавливает выравнивание к левому краю поля вывода (по умолчанию производится выравнивание к правому краю поля вывода).
unsetf(ios::left) – отменяет выравнивание к левому краю поля вывода. */
out.width(29);
out.fill('-');
out << '-' <<endl;
out.fill(' ');
out.width(1);
out << '|';
out.width(15);
out.setf(ios::left);
out << man.name;
out.width(1);
out << '|';
out.width(5);
out.unsetf(ios::left);
out << man.group;
out.width(1);
out << '|';
out.width(5);
out << man.age;
out.width(1);
out << '|' <<endl;
out.width(29);
out.fill('-');
out << '-' << endl;
out.fill(' ');
}
}
}
Файл result.txt
Список студентов не служивших в армии
-----------------------------
|Петров | 924| 19|
-----------------------------
-----------------------------
|Карасиков | 924| 17|
-----------------------------
-----------------------------
|Либерман | 924| 25|
Реальная зарплата
Real salary
Задан текстовой файл
Строка файла имеет вид
1wwwwwwwwwwww 120 22 33 44 44 55 66 77 88 99 2 2 0.15
ФИО 12 чилел – зарплаты по месяцам и процент кредита
Создать структуру salary
Поля:
-фио – символьная строка
-целочисленный массив зарплат
-процент по кредиту –тип вещественный
-реальная зарплата за год
Реальная зарплата вычисляется как сумма зарплат всех месяцев*0.87*(1-credit)/12;
Все структуры перенести в бинарный файл.
Далее. Переносим структуры из бинарного файла
в массив. Размерность масства задается динамически.
Упорядочить массив по невозрастанию реальной зарплаты.
На экран вывести 5 первых сотрудников.
//arb2014_binary_real_salary
#include <iostream>
#include <fstream>
using namespace std;
const int n=12;
struct salary
{
char fam[30];
int m[n];
double credit;
double real_salary;
};
//////////////////////////////
void main()
{
int i,j, num=0;
salary* z;
ifstream in("salary.txt");
ofstream out("salary.bin", ios::binary);
salary x;
if(!in)
{
cout<<"file not open!";
exit(-1);
}
while (in)
{
in>>x.fam;
for (i=0; i<n; i++)
{
in>>x.m[i];
}
in>>x.credit;
double s=0;
for(i=0; i<n; i++)
{
s=s+x.m[i];
}
s=s*0.87*(1-x.credit);
x.real_salary=s/12;
if(in)
{
out.write ((char*)&x, sizeof (salary));
num++;
}
}
in.close();
out.close();
z=new salary[num];
ifstream in1("salary.bin", ios::binary);
i=0;
while (i<num && in1.read((char*)&z[i], sizeof(salary)))
{
i++;
}
in1.close();
for(i=0; i<num-1; i++)
for(j=i+1; j<num; j++)
{
if(z[i].real_salary<z[j].real_salary)
{
x=z[i];
z[i]=z[j];
z[j]=x;
}
}
cout<<" high salary 5 employees"<<endl;
for(i=0; i<5; i++)
cout<<z[i].fam<<" "<<z[i].real_salary<<endl;
}
Файл salary.txt
1wwwwwwwwwwww 120 22 33 44 44 55 66 77 88 99 2 2 0.15
2wwwwwwwwwwww 135 22 33 44 44 55 66 77 88 99 2 2 0.15
3wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15
4wwwwwwwwwwww 12 226 33 44 44 55 66 77 88 99 2 2 0.15
5wwwwwwwwwwww 126 225 33 44 44 55 66 77 88 99 2 2 0.15
6wwwwwwwwwwww 12 22 33 44 44 55 66 77 88 99 2 2 0.15
7wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15
8wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15
9wwwwwwwwwwww 12 22 33 446 44 55 66 77 88 99 2 2 0.15
10wwwwwwwwwwww 12 22 33 446 44 55 66 77 88 99 2 2 0.15
12wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15
13wwwwwwwwwwww 12 226 33 44 44 55 66 77 88 99 2 2 0.15
14wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15
15wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15
16wwwwwwwwwwww 126 22 336 644 44 55 66 77 88 99 2 2 0.15
17wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15