#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string.h>
using namespace std;
struct tstudent{ // main file
int nr_entry;
int student_number;
char name[35];
int year;
};
struct tindex{ // index file
int student_number;
};
fstream dat,ind; // file objects
void input(char *character_array) // function to avoid newline
{
cin.getline(character_array,150);
if(cin.gcount()==1)
cin.getline(character_array,150);
}
void manual_input(){
tstudent layer;
tindex index;
int counter;
// 1. number of file entries
if(!dat){
counter=0;
dat.open("student.dat",ios::out|ios::binary);
}
else{ // file exists
dat.seekg(0,ios::end);
counter=dat.tellg()/sizeof(tstudent);
dat.close();
dat.open("student.dat",ios::out|ios::app|ios::binary);
ind.open("student.ind",ios::out|ios::app|ios::binary);
}
// 2. adding a new entry into the file
counter++;
cout << "Entry number " << counter << endl;
layer.nr_entry=counter;
cout << "Student's number:"; cin >> layer.student_number;
cout << "First and last name:";input(layer.name);
cout << "Year of college:";cin >> layer.year;
dat.write((char *)&layer,sizeof(tstudent));
index.student_number=layer.student_number;
ind.write((char *)&index,sizeof(tindex));
dat.close();
ind.close();
};//manual_input() END
void output_entries(){
tstudent layer;
tindex index;
dat.open ("student.dat",ios::in|ios::binary);
ind.open ("student.ind",ios::in|ios::binary);
while (1){
ind.read ((char *)&index,sizeof(tindex));
if (ind.eof())break;
dat.seekg(index.student_number);
dat.read ((char *)&layer, sizeof(tstudent));
cout << "Entry number " << layer.nr_entry << endl;
cout << "Student's number:" <<layer.student_number << endl;
cout << "First and last name:"<<layer.name<<endl;
cout << "Year of college:"<<layer.year<<endl;
}//while
dat.close();
ind.close();
};//output_entries() END
void entry_search(int nr){
tstudent layer;
tindex index;
bool found=false;
int counter=0;
dat.open ("student.dat",ios::in|ios::binary);
ind.open ("student.ind",ios::in|ios::binary);
while (1){
ind.read ((char *)&index, sizeof(tindex));
counter++;
if (ind.eof())break;
if (index.student_number==nr){
dat.seekg(index.student_number);
dat.read ((char *)&layer, sizeof(tstudent));
found=true;
cout << "Entry number: " << layer.nr_entry << endl;
cout << "Student's number:"<<layer.student_number << endl;
cout << "First and last name:"<<layer.name<<endl;
cout << "Year of college:"<<layer.year<<endl;
break;
}//if
}//while
dat.close();
ind.close();
if (!found) cout << "The entry wasn't found!" << endl;
cout <<"Number of entries read:"<<counter<<endl;
};
int main(){
int choice;
int nr;
do{cout << endl;
cout << "1. adding a new entry into main and index (manually)" << endl;
cout << "2. print all the entered data" << endl;
cout << "3. Search the entries" << endl;
cout << "4. Exit the program" << endl;
cin >> choice;
switch (choice){
case 1:manual_input();break;
case 2:output_entries();break;
case 3:cout << "Student's number:"; cin >> nr;
entry_search(nr);break;
case 4: exit(0);
}//switch
} while (choice!=9);
return 1;
}