Community discussion forum

generic code for writing structures, help me make it more generic

Tags: c++ Viet Nam
  • 2 months ago

    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.isopen())
        {
            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 EXPORTIMPORTSTRUCTDECH
    #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

  • Advertisement

    Simply the fastest line-level profiler for .NET ever

    “The low overhead means it has minimal impact on the execution of my program”
    Mark Everest, Development Team Leader, Renault F1 Team Ltd.

    Try out the new ANTS Profiler 4 for yourself. Download your 14-day trial now

  • 2 months ago

    im afraid i dont know what that nonsense   is where all of my tabs are and cant get rid of it

  • 2 months ago

     Hi chopficaro,

    I had a problem like yours, when I pasted some text from MS Word.

    I suggest, just paste your code from VS or a .txt file, or just type that here (first clear all of your post).

Post a reply

Enter your message below

Sign in or Join us (it's free).