Saving Two Structures in One File

Intro...
Okay so er, hi to everyone. I'm new to this forums, as you can see.
Anyways, I have partly read the forum rules and it's stated there not to ask for help in assignments.homework programs/projects, but asking for a hint is okay so... yeah...

Story...
Okay so our teacher taught us about how to use structures and how to write/save, open, and close files... But as usual, he gave us simple examples, and gives us complicated quizzes... I am fine with that, 'cause it's for us to brainstorm, but this one's too difficult for me to handle, so can I ask for some hints?

Codes...(No SPOILER tags here? Well, I guess CODE tags will do...)
This is my code named main.cpp...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include "main.h"

void menu();
void close();

int main()
{
    FILE *file;
    int x, yy=0;
    register int i=0;
    register int j=0;
    load();
    a:{             //Main Menu
        menu();
        cin>>x;
    }
    if(x==1){
        amenu(i,yy);
        close();
        goto a;
    }
    else if(x==2){
        emenu(i);
        close();
        goto a;
    }
    else if(x==3){
        //load();
        sdmenu(i,yy);
        close();
        goto a;
    }
    else if(x==4){
        dmenu();
        close();
        goto a;
    }
    else if(x==5){
        close();
        fclose(file);
        exit(0);
    }
    else/* if(x!='1' || x!='2' || x!='3' || x!='4 '|| x!='5')*/{
        cout<<"\n\nInvalid Input!"<<endl;
        getch();
        goto a;
    }

    return 0;
}

void menu(){
    clrscr();
    cout<<"Enrollment System Menu"<<endl;
    cout<<"[1] Add Student Record"<<endl;
    cout<<"[2] Edit Student Record"<<endl;
    cout<<"[3] Search/Display Student Record"<<endl;
    cout<<"[4] Delete Student Record"<<endl;
    cout<<"[5] Exit"<<endl;
    cout<<"\nChoose: ";
}

void close(){
    FILE *file;

    register int i;

    if((file=fopen("Student.dat","wb"))==NULL){
        //printf("cannot open file\n");
        //getche();
        return;
    }
    for(i=0;i<100;i++){
        if(*record[i].id){
            if(fwrite(&record[i],sizeof(struct Record),1,file)!=1){
                printf("file write error\n");
                getche();
            }
        }
    }
    for(i=500; i<1000; i++){
        if(*subject[i].sid){
            if(fwrite(&subject[i],sizeof(struct Subject),1,file)!=1){
                printf("file write error\n");
                getche();
            }
        }
    }
}


Hm... The length of a single post isn't enough for my header code, so I'll post it after this one... I hope double posting is fine here...
Okay so here's my other code. It's a header file called main.h... This is where I call all the important functions, as what we were instructed...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
struct Record{
    int num;
    char id[10];
    char fname[20];
    char mname[1];
    char sep[2];
    char lname[20];
    char ex[10];
    int age;
    char ylvl[10];
    char course[10];
}record[500];

struct Subject{
    int num;
    char stid[10];
    char sid[10];
    int prelim;
    int midterm;
    int semifinal;
    int final;
    int average;
}subject[1000];

#ifndef _amenu
#define _amenu
amenu(int i, int y){
    FILE *file;
    char x, iden[10];
    char name[20];
    int z=i, p=1;
    int y, input, rec, sub;
    a:{
        clrscr();
        cout<<"Add Student Record"<<endl;
        cout<<"[1] Register"<<endl;
        cout<<"[2] Subject Grade"<<endl;
        cout<<"[3] Return to Main Menu"<<endl;
        cout<<"\nChoose: ";
        cin>>input;
    }
    switch(input){
        case 1:{         //Adding New Student Record
            FILE *file;
            file=fopen("Student.dat","ab");
            clrscr();
            if(yy==1){
                cout<<"Fatal Error Detected!\nPlease Close The Program...";
                getch();
                return yy;

            for(p=1; p<500; p++){
                if(record[p].num==NULL){
                    record[p].num=p;
                    cout<<"Student ID Number: ";
                    gets(name);
                    strcpy(record[p].id,name);

                    cout<<"First Name: ";
                    gets(name);
                    strcpy(record[p].fname,name);

                    cout<<"Middle Name: ";
                    gets(name);
                    strcpy(record[p].sep,"  ");
                    strcpy(record[p].mname,name);

                    cout<<"Last Name: ";
                    gets(name);
                    strcpy(record[p].lname,name);

                    cout<<"Extension Name:\n[0]None, [1]Senior, [2]Junior, [3]III, [4]IV, [5]V\nChoose: ";
                    cin>>x;
                    if(x=='0')
                        strcpy(record[p].ex,"None");
                    else if(x=='1')
                        strcpy(record[p].ex,"Senior");
                    else if(x=='2')
                        strcpy(record[p].ex,"Junior");
                    else if(x=='3')
                        strcpy(record[p].ex,"III");
                    else if(x=='4')
                        strcpy(record[p].ex,"IV");
                    else if(x=='5')
                        strcpy(record[p].ex,"V");
                    else
                        strcpy(record[p].ex,"Invalid");

                    cout<<"Age[15-30]: ";
                    cin>>y;
                    if(y>=31 || y<=14)
                        record[p].age=0;
                    else if(y>=15 || y<=30)
                        record[p].age=y;

                    cout<<"Year Level:\n[1]1st Year, [2]2nd Year, [3]3rd Year, [4]4th Year\nChoose: ";
                    cin>>x;
                    if(x=='1')
                        strcpy(record[p].ylvl,"1st Year");
                    else if(x=='2')
                        strcpy(record[p].ylvl,"2nd Year");
                    else if(x=='3')
                        strcpy(record[p].ylvl,"3rd Year");
                    else if(x=='4')
                        strcpy(record[p].ylvl,"4th Year");
                    else
                        strcpy(record[p].ylvl,"???");

                    cout<<"Course:\n[1]BSCS, [2]BSIT, [3]BSBA\nChoose: ";
                    cin>>x;
                    if(x=='1')
                        strcpy(record[p].course,"BSCS");
                    else if(x=='2')
                        strcpy(record[p].course,"BSIT");
                    else if(x=='3')
                        strcpy(record[p].course,"BSBA");
                    else
                        strcpy(record[p].course,"???");

                    cout<<"\nPress Any Key To Go Back...";
                    fclose(file);
                    getch();
                    goto a;
                }
            }
        }
        case 2:{         //Adding New Subject Record
            b:{
                //j=i+1;
                FILE *file;
                file=fopen("Student.dat","rb");
                clrscr();
                cout<<"Search Student I.D.: ";
                cin>>iden;
            }
            for(int k=0; k<=500; k++){
                if(!strcmp(record[k].id,iden)){
                FILE *file;
                file=fopen("Student.dat","ab");
                    for(p=500; p<1000; p++){
                        if(subject[p].num==NULL){
                            subject[p].num=p;

                            cout<<"Found!"<<endl;
                            strcpy(subject[p].stid,iden);

                            cout<<"Subject I.D.: ";
                            cin>>subject[p].sid;

                            cout<<"Prelim Grade: ";
                            cin>>subject[p].prelim;

                            cout<<"MidTerm Grade: ";
                            cin>>subject[p].midterm;

                            cout<<"PreFinal Grade: ";
                            cin>>subject[p].semifinal;

                            cout<<"Final Grade: ";
                            cin>>subject[p].final;

                            cout<<"Computation of Average Final is ";
                            //formula in computing the final grade
                            subject[p].average=(subject[p].prelim+subject[p].midterm+subject[p].semifinal+subject[p].final)/4;

                            cout<<subject[p].average<<endl;
                            cout<<"\nPress Any Key To Go Back...";

                            getch();
                            goto a;
                        }
                    }
                }
            }
            cout<<"Not Found!"<<endl;
            cout<<"\nSearch Again[y/n]?: ";
            cin>>x;
            if(x=='y'){
                goto b;
            }
            else if(x=='n'){
                fclose(file);
                goto a;
            }
        }
        case 3:{
            return i;
        }
        default:{
            cout<<"\nInvalid Input";
            getch();
            amenu(i,j);
        }
    }
    return i,j;
}
#endif

#ifndef _emenu
#define _emenu
int emenu(int i){
    code deleted to fit in post length...
}
#endif

#ifndef _dmenu
#define _dmenu

void dmenu(){
    clrscr();
    cout<<"Delete Student Record"<<endl;
    cout<<"[1] Registration"<<endl;
    cout<<"[2] Subject Grade"<<endl;
    cout<<"[3] Return to Main Menu"<<endl;
    cout<<"\nChoose: ";
}
#endif

#ifndef _load
#define _load

void load(){
  FILE *file;

  register int i;

  if((file=fopen("Student.dat","rb"))==NULL){
    //printf("Cannot Open File\n");
    //getche();
    return;
  }

  /*register int t;

  for(t=0; t<500; t++)
  {
    *record[t].id ='\0';
  }*/

    for(i=0;i<1500;i++){
        if(fread(&record[i],sizeof(struct Record),1,file)!=1){
            if(feof(file)){
                    fclose(file);
                    return;
                }
                printf("File read error\n");
            }
        if(fread(&subject[i],sizeof(struct Subject),1,file)!=1){
            if(feof(file)){
                fclose(file);
                return;
            }
            printf("File read error\n");
        }
    }
}
#endif 


The header code isn't finished yet but here's the problem...

Problems...
1. In the Search Function, searching for student records are okay, but when I search for their subject records, I can't display them, nor are they found by the program, but they're saved in the file already... =/
2. ...I guess that's my only problem... Editing and deleting are easy to do.

Thanks~
and the continuation... =/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

#ifndef _sdmenu
#define _sdmenu

int sdmenu(int i){
    FILE *file;
    file=fopen("Student.dat","rb");
    int x, p=1;
    char iden[10], siden[10], y;
    char sid[10];
    a:{
        clrscr();
        cout<<"Search Student I.D. Number: ";
        scanf("%s", &iden);
    }
    for(int z=0; z<=500; z++){
        if(!strcmp(record[z].id,iden)){
            file=fopen("Student.dat","rb");
            cout<<"Found!\n\nCurrent Record..."<<endl;
            textcolor(YELLOW);
            cout<<"First Name: ";
            cprintf("%s", record[z].fname);
            cout<<"\nMiddle Name: ";
            cprintf("%s", record[z].mname);
            cout<<"\nLast Name: ";
            cprintf("%s", record[z].lname);
            cout<<"\nExtension Name: ";
            cprintf("%s", record[z].ex);
            cout<<"\nAge: ";
            cprintf("%d", record[z].age);
            cout<<"\nYear Level: ";
            cprintf("%s", record[z].ylvl);
            cout<<"\nCourse: ";
            cprintf("%s", record[z].course);

            cout<<"\n\nSearch Subject Code: ";
            scanf("%s", &siden);

            for(p=499; p<=1000; p++){
                //FILE *file;
                //file=fopen("Student.dat","rb");
                if(subject[p].num==NULL){
                    //cout<<p<<" = NULL , ";
                }else{
                    if(!strcmp(subject[p].sid,siden)){
                        //if(!strcmp(subject[p].stid,iden)){
                            //file=fopen("Student.dat","rb");
                            cout<<"\nPrelim Grade: "<<subject[p].prelim<<"\nMidTerm Grade: "<<subject[p].midterm;
                            cout<<"\nPreFinal Grade: "<<subject[p].semifinal<<"\nFinal Grade: "<<subject[p].final;
                            cout<<"\nAverage: "<<subject[p].average;
                            getch();
                            /* I need a */break;
                            goto qu;
                        //}
                    }
                }
                //break;
            }
            break;
            goto qu;
        }
    }
    cout<<"\nNot Found!";
    //cout<<"Not Found!"<<endl;
    qu:{
        cout<<"\nSearch Again[y/n]?: ";
        cin>>y;
        if(y=='y'){
            goto a;
        }
        else if(y=='n'){
            //fclose(file);
            return i;
        }
    }

}
#endif 
Topic archived. No new replies allowed.