well ive got a program that scans a structure from cin and puts it in a binary file, and can also take it out of the binary file and display it. i like the interface ive made very much, i want to use this code for many many projects without having to change much,
especially for many different types of structures,
so im trying to make it more generic, but i havent a clue how to proceed. my guess is that ill have to use some element of classes.
im not asking u to write my code i just want a hint. anything at all would be greatly appreciated
take a look:
exportimportstructmain.cpp
#include <iostream>
#include <fstream>
#include "exportimportstructdec.h"
using namespace std;
grades myGradesi,myGradeso,myGradesa;
//declare pointers to structures for file io:
grades * pMyGradeso=&myGradeso;
grades * pMyGradesa=&myGradesa;
grades * pMyGradesi;
int main ()
{
int choice;
char opFile[]="binary.bin";
char opMessage[]="
please enter 4 grades separated by pressing enter
";
char menu[]="
do u want to
1, read from the file, or
2, write over the file or
3, append the file or
4, exit the program?
";
//give the user options:
do
{
cout<<menu;
cin>>choice;
//option 1, read from the file:
if (choice==1)
{
readfile(opFile,myGradesi,pMyGradesi);
}
//option 2, write over the file:
if (choice==2)
{
wrtfile(opFile,opMessage,myGradeso,pMyGradeso);
}
//option 3, append the file:
if (choice==3)
{
appfile(opFile,opMessage,myGradesa,pMyGradesa);
}
//option 4, exit:
}while (choice!=4);
return 0;
}
exportimportstructdef.cpp
#include <iostream>
#include <fstream>
#include "exportimportstructdec.h"
using namespace std;
extern grades myGradesi, myGradeso, myGradesa;
extern grades *pMyGradeso, *pMyGradesa, *pMyGradesi;
//the purpose of this program is to send structures into a file, and then read them from the same file
//structure to be written:
void readfile(char readFileName[],grades structi,grades * pStructi)
{
//check the size of the file and allocate appropriate memory:
long begin,end;
ifstream filecheck (readFileName);
if (filecheck.is_open())
{
begin = filecheck.tellg();
filecheck.seekg (0, ios::end);
end = filecheck.tellg();
filecheck.close();
int fileSize=(end-begin)/(sizeof(structi));
pStructi= new grades [fileSize];
}
else cout << "
Unable to open file for size check
";
//read the file into memory:
int structArraySize=0;
ifstream filei;
filei.open (readFileName, ios::in|ios::binary);
if (filei.is_open())
{
while ((filei.peek()!=EOF))
{
filei.read(reinterpret_cast<char*>(&pStructi[structArraySize]), sizeof(grades));
structArraySize++;
}
//display memory on screen:
printmemory(structArraySize,pStructi);
}
else cout << "
Unable to open file for input
";
}
void wrtfile(char wrtFileName[],char wrtMessage[],grades structo,grades * pStructo)
{
ofstream fileo;
fileo.open (wrtFileName, ios::out|ios::binary);
cout << wrtMessage;
scanstruct(pStructo);
if (fileo.is_open())
{
fileo.write (reinterpret_cast<char*>(pStructo), sizeof(structo));
fileo.close();
}
else cout << "
Unable to open file for output
";
}
void appfile(char appFileName[],char appMessage[],grades structa,grades * pStructa)
{
ofstream filea;
filea.open (appFileName, ios::app|ios::binary);
cout << appMessage;
scanstruct(pStructa);
if (filea.is_open())
{
filea.write (reinterpret_cast<char*>(pStructa), sizeof(structa));
filea.close();
}
else cout << "
Unable to open file for output
";
}
void scanstruct(grades * pStructscan)
{
cin >> (*pStructscan).grade1 >> (*pStructscan).grade2 >> (*pStructscan).grade3 >> (*pStructscan).grade4;
}
void printmemory(int specificStructArraySize,grades * pStructi)
{
for(int i=0;i<specificStructArraySize;i++)
{
cout<<"
grade1
"<< (pStructi[i]).grade1<<"
grade2
"<< (pStructi[i]).grade2<<"
grade3
"<< (pStructi[i]).grade3<<"
grade4
"<< (pStructi[i]).grade4<<"
";
}
}
exportimportstructdec.h
#ifndef EXPORTIMPORTSTRUCTDEC_H
#define EXPORTIMPORTSTRUCTDEC_H
struct grades
{
int grade1;
int grade2;
int grade3;
int grade4;
};
void printmemory(int ,grades * );
void scanstruct(grades * );
void readfile(char [],grades ,grades * );
void wrtfile(char [],char [],grades ,grades * );
void appfile(char [],char [],grades ,grades * );
#endif
Enter your message below
Sign in or Join us (it's free).