Код:
#pragma hdrstop
#pragma argsused
#include <stdio.h>
#include <tchar.h>
#include <iostream.h>
#include <conio.h>
FILE *st;
FILE *vrem;
FILE *zad;
struct pr
{
char name[20];
int oz;
};
struct sess
{
int coutpr;
struct pr pred[10];
};
struct s
{
char fam[25];
char name[25];
char db[10];
char dp[10];
char fak[25];
char kaf[25];
int zach;
float procent3;
struct sess sem[9];
}stud,stud2;
long size
razmer(){
st = fopen("stud.dat","r");
fseek(st,0,SEEK_END);
size = ftell(st);
fclose(st);
}
zapis(){
int sem_n,j;
char more,moresem,pisat;
moresem = 'Y'; pisat = 'N';
cout << "Famili9: "; cin >> stud.fam;
cout << "Im9: "; cin >> stud.name;
cout << "God Rogdeni9: "; cin >> stud.db;
cout << "God postupleni9: "; cin >> stud.dp;
cout << "Fakkultet: "; cin >> stud.fak;
cout << "Kafedra: "; cin >> stud.kaf;
cout << "Zachetka: "; cin >> stud.zach;
cout << "Vvesti ocenki?"; cin >> pisat;
if (pisat == 'Y') {
for (sem_n = 0; sem_n <= 9; sem_n++) {
more = 'Y';
j = 0; stud.sem[sem_n].coutpr = 0;
cout << sem_n+1<< " semestr"<< '\n'<< "---------------------------------------"<< '\n';
cout << "Vvesti ozenki za etot semestr (Y/N?) ";
cin >> moresem;
if (moresem == 'N'){
moresem == 'Y';
continue;
}
while (more !='N'){
cout << "predmet: "; cin >> stud.sem[sem_n].pred[j].name;
cout << "ozenka: "; cin >> stud.sem[sem_n].pred[j++].oz;
cout << "more (Y/N)?: "; cin >> more;
stud.sem[sem_n].coutpr++;
if (j >= 18){
cout << "Massiv zapolnen";
break;
}
}
}
}
}
vivodsess(int nomer){
st = fopen("stud.dat","r");
int k = 0; int coutpr;
fseek(st,((nomer-1)*sizeof(struct s)),SEEK_SET);
fread(&stud, sizeof(struct s), 1, st);
for (int i = 0; i < 5; i++) {
k++;
printf("%-2i%-40s%-2i%-40s\n",k,"semestr",k+1,"semestr");
printf("%-20s%-20s%-20s%-20s\n","predmet","ozenka","predmet","ozenka");
if (stud.sem[k-1].coutpr > stud.sem[k].coutpr)
coutpr = stud.sem[k-1].coutpr;
else
coutpr = stud.sem[k].coutpr;
for (int l = 0; l < coutpr; l++) {
printf("%-20s%-20i%-20s%-20i\n", stud.sem[k-1].pred[l].name,stud.sem[k-1].pred[l].oz, stud.sem[k].pred[l].name, stud.sem[k-1].pred[l].oz);
}
k++;
}
fclose(st);
return 0;
}
vivodspiska(){
int nomer,i,nomerdeiy;
razmer();
st = fopen("stud.dat","r");
printf("%-5s%-1s%-14s%-1s%-10s%-1s%-6s%-1s%-6s%-1s%-8s%-1s%-8s%-1s%-6s","Nomer","|","Famili9","|","Im9","|","DB","|","DP","|","Fakultet","|","Kafedra","|","Zachetka\n");
for (int i=0; i < size/sizeof(struct s); i++) {
fread(&stud, sizeof(struct s), 1, st);
printf("%-5i%-1s%-14s%-1s%-10s%-1s%-6s%-1s%-6s%-1s%-8s%-1s%-8s%-1s%-6i\n",i+1,"|", stud.fam,"|", stud.name,"|",stud.db,"|",stud.dp,"|", stud.fak,"|",stud.kaf,"|",stud.zach);
}
fclose(st);
cout << "Vvedite nomer studenta s kotorim rabotaem";
cin >> nomer;
cout << "4to s nim bedem delat'?"
<< '\n'
<< "1-vivod ozenok za sessiu"
<< '\n'
<< "2-ydalit"
<< '\n'
<< "3-redaktirovat"
<< '\n';
cin >> nomerdeiy;
switch (nomerdeiy) {
case 1: vivodsess(nomer);break;
case 2: ydal(nomer); break;
case 3: redak(nomer); break;
}
return 0;
}
vvod(){
zapis();
st = fopen("stud.dat","a");
fwrite(&stud, sizeof(struct s), 1, st);
fclose(st);
return 0;
}
main(){
int comanda;
for (;;) {
cout << "vvedite nomer comandi: "; cin >> comanda;
switch(comanda){
case 1: vvod(); break;
case 2: vivodspiska(); break;
case 3: poisk(); break;
case 4: zadanie(); break;
}
}
return 0;
}
Вообщем проблема в следующем: при считывании оценок по сессиям у студентов данные почему то перемешиваются, к примеру сделаем 3 записи в первых 2 ввести какие либо оценки а в 3 ничего и если вывести оценки 2 запип то они там будут в перемешку с 1 записью и если поппытаться вывести оценки 3 записи то там будут вперемешку оценки 1 и 2 записи. Данные не вложенных записей читаются нормально( у каждого своё)