Как правильно подключать txt файлы ввода/вывода?
Дана структура из студентов фио и 4 оценки по предметам. Задача: вывести фамилию студента, который имеет наибольший средний бал.
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
struct student
{
char fio[20];
float math;
float bio;
float hist;
float fhil;
};
int main()
{
int k;
float max=0;
setlocale(0,"");
struct student stud[3];
for(int i=0;i<3;i++)
{
cout<<endl<<"FIO ";
cin>>stud[i].fio;
cout<<"bal ";
cin>>stud[i].math>>stud[i].bio>>stud[i].hist>>stud[i].fhil;
}
cout<<"Max bal : ";
for(int i=0;i<3;i++)
{
if(((stud[i].math+stud[i].bio+stud[i].hist+stud[i].fhil)/4)>max)
{
max=(stud[i].math+stud[i].bio+stud[i].hist+stud[i].fhil)/4;
k=i;
}
}
cout<<max<<endl;
cout<<"и принадлежит студенту : "<<stud[k].fio;
}
Этот фрагмент работает на ура, но мне нужно сделать то же самое, только чтобы данные считались из файла dat.txt и записывались в rez.txt .
#include <iostream>
#include <conio.h>
#include <cstring>
#include <fstream>
using namespace std;
struct student
{
char fio[3];
float math;
float bio;
float hist;
float fhil;
}stud[4];
int i;
FILE *InFile, *OutFile;
int main()
{
int k;
float max=0;
InFile=fopen("dat.txt","rb");
OutFile=fopen("rez.txt","wt");
for(i=0;i<4;i++)
fread(&stud[i], sizeof(student), 1, InFile);
fprintf(OutFile, "Максимальный бал принадлежит студенту :\n");
for(i=0;i<4;i++)
{
if(((stud[i].math+stud[i].bio+stud[i].hist+stud[i].fhil)/4)>max)
{
max=(stud[i].math+stud[i].bio+stud[i].hist+stud[i].fhil)/4;
k=i;
}
}
fprintf(OutFile,stud[k].fio);
return 0;
}
не могу понять как работает чтение и запись в файл
Ответы (2 шт):
У вас же С++, так что надо использовать
ifstream InFile("dat.txt");
ofstream OutFile("rez.txt");
Все, дальше используете InFile и OutFile в точности так же, как cin и cout:
OutFile << max <<endl;
OutFile << "и принадлежит студенту : " << stud[k].fio;
Как правильно?.. Правильно можно написать по разному, но в С++ нужно иметь обьектно_ориентированный взгляд, чтобы программировать также. По этому поводу я хочу обратить ваше внимание на вашу структуру:
- Каждый студент имеет 4 целочисленных обьекта, хранящие оценки по разным предметам. Это значит, что студент существует только, если имеет эти оценки _ нет оценок, нет и студента. А если он только поступил? Кто не сдал экзамен, тот еще не студент?...
Это плохой подход _ нужно четко определить что характеризует обьекта(представление) и о чем всегда знает обьект? . Мы можем построить первоначальную абстракцию, что студент имеет имя и знает сколько предметов он изучает(при желании можно добавить и названия этих предметов), но это знание не является физической частью студента, поэтому оно не должно добавлять место в занимаемой студентом пространства(памяти). Теперь можем написать свою обьектно_орьентированную структуру:
struct student
{
//константное выражение, определяющее количество изучаемых предметов
enum { number_of_items = 4};
//если вы уверены, что 10 символов достаточно, то
char name[11]{};
};
Кому то(функции, классу) нужно читать|записать из|в файл имя и оценки студента. Для удобства я использую символьную строку для записи оценок:
int main() {
ifstream InFile("dat.txt");
ofstream OutFile("rez.txt");
student s1;
/*два символа для оценки, один пробел
(s1.number_of_items раз) и завершающий ноль*/
constexpr size_t length = 3 * s1.number_of_items + 1;
char grade[length];
//вы же можете читать как числа. Например в int grade[s1.number_of_items]
for (int i = 0; i < 4; ++i) {
InFile >> s1.name; //чтение имени
InFile.getline(grade, length); //чтение оценок
OutFile << s1.name << grade <<'\n';
}
return 0;
}
Это лишь примитивный код без проверок на корректность ввода и с другими недостатками, но улучшить его дело вкуса и желаний.