Записать блоком 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

Наши рекомендации