Чтение данных из двоичного файла

К выполнению лабораторной работы №3.

Тема: «Редактирование строк и обработка текстовых файлов с использованием ООП».

Задание на ЛР3совпадает с заданием на ЛР2, но дополнительно

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

Пример индивидуального задания:

Имеются сведенияо результатах сдачи сессии студентами группы:

Фамилия студента и оценки за 3 экзамена.

Требуется: а) для каждого студента найти средний балл за сессию;

б) по каждому предмету найти средний балл группы, а также процент отличников и процент не сдавших экзамен студентов с указанием названий предметов.

Пример оформления программного кода:

// Подключение стандартных библиотек:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<string.h>

#include<iostream.h>

#include<io.h>

//Подключение пользовательской библиотеки работы со строками (класс STRING):

#include "My_str.h"

struct Zap{ char Fam[10]; //Фамилия студента

int Bal[3]; //Оценки за сессию

float SRED; }; //Средний балл

struct Rec{ char Naz[15]; //Название предмета

float PR[3];}; //Средний балл и искомые %-ты

//****************************

Class PRED{//Описание класса для работы с предметами

friend class STUD;

Rec* P;

int N;

public:

void Input(); //Ввод названий предметов

void Print(); //Вывод результата

PRED(int k){N=k; P=new Rec[k];}

~PRED(){delete []P;}

};

//Описание функций класса PRED:

void PRED::Input(){//Ввод названий предметов:

for(int i=0;i<N;i++){

cout<<"\n Input nazv. predmeta : "<<i+1<<"). ";cin>>P[i].Naz;

for(int j=0;j<3;j++)P[i].PR[j]=0;

}}

///Вывод результата:

void PRED::Print(){ FILE *f=stdout; int k;

do{ fprintf(f,"\n---------------------------------------------------");

fprintf(f,"\n N Nazvanie SR_Bal Proc_5 Proc_2 ");

fprintf(f,"\n---------------------------------------------------");

for(int i=0;i<N;i++){

fprintf(f,"\n%4d). %15.14s",i+1,P[i].Naz);

for(int j=0;j<3;j++)fprintf(f," %8.2f",P[i].PR[j]);

}

fprintf(f,"\n---------------------------------------------------");

k=0;

if(f==stdout){cout<<"\n Save in file Predmet.txt ? (1-Yes, 0-No): ";

cin>>k;if(k)f=fopen("Predmet.txt","wt");}

else fclose(f);

}while(k); }

//************************************

Class STUD{//Описание класса для работы со студентами

Zap* Mas;

int kol; //количество студентов в группе

public:

void Input(); //Ввод исходных данных

void Input_con(int n); //Ввод данных с клавиатуры

void Input_RND(int n); //Ввод данных случайным образом

void Input_FL(); //Ввод данных из файла

void Input_bin(FILE*); //Чтение данных из двоичного файла

void Input_txt(FILE*); //Чтение данных из текстового файла

Zap Sozd_ZAP(char*); //Перенос данных из символьной строки в запись

void Action(); //Выполнение пункта а) задания

void Print_SR(); //Вычисления ср.баллов по предметам

void Print_table(FILE*); //Вывод таблицы результата

void Write_bin(FILE*); //Запись данных в двоичный файл

void Print_Sort(); //Вывод результата сортировки

int Save(); //Сохранение результата работы

void Sort_Pole(int);//Сортировка данных

void Punkt_B(PRED&); //Выполнение пункта б) задания

STUD(){kol=0;} //Конструктор класса

~STUD(){delete []Mas;} //Деструктор класса

};

//Описание функций класса STUD:

Ввод исходных данных

void STUD::Input(){ int i,N;

cout<<"\n Input data from :";

cout<<"\n 1- Consol, 2- RND, 3- File (0- Exit): -> "; cin>>i;

if(!i)exit(0);

if(i<3){cout<<"\n Input kol-vo zapisei: "; cin>>N;}

switch(i){

case 1:Input_con(N);break;

case 2:Input_RND(N);break;

case 3:Input_FL();

} }

Ввод данных из файла

void STUD::Input_FL(){FILE* ft; int L; char NF[15];

do{cout<<"\n File: 1 - txt, 2 - bin, 0 - Exit: ";cin>>L;

switch(L){

case 1:ft=fopen(NF,"rt"); if(!ft){cout<<"\n File -> no exist!";break;}

Input_txt(ft);fclose(ft);L=0;break;

case 2:ft=fopen(NF,"rb"); if(!ft){cout<<"\n File -> no exist!";break;}

Input_bin(ft); fclose(ft);L=0;

};

}while(L); }

Чтение данных из двоичного файла

void STUD::Input_bin(FILE* f){ Zap z;

if(kol)delete []Mas;

int i=fileno(f);

long L=filelength(i);

kol=L/sizeof(Zap);

cout<<"\n Kol-vo zapisei="<<kol;

Mas=new Zap[kol];

for(i=0;i<kol;i++)fread(Mas+i,sizeof(Zap),1,f);

cout<<"\n Press any key...";getch(); }

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