Чтение данных из двоичного файла
К выполнению лабораторной работы №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(); }