Programming C, C++, Java, PHP, Ruby, Turing, VB
Computer Science Canada 
Programming C, C++, Java, PHP, Ruby, Turing, VB  

Username:   Password: 
 RegisterRegister   
 fread/fwrite
Index -> Programming, C++ -> C++ Help
View previous topic Printable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic
Author Message
chopficaro




PostPosted: Sat May 10, 2008 5:58 pm   Post subject: fread/fwrite

ok i got past that part i posted about before, now im having some more trouble. i can add 2 patients easily to the file. then i try to display them. it displays the first one just fine, but the second it tries to display the first value in the [1]th element of the array, i get an error message. that part of my code is marked with a /*error*/ just before it. easy to find plz help this is due monday.

heres my code
code:

#include "iostream"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "process.h"
#define maxpatients 8
using namespace std;

void main();



struct namestruct
{
        char firstName[32];
        char middleI;
        char lastName[32];
};

struct addressstruct
{
        char streetAddress[32];
        char city[32];
        char state[3];
        int zipcode;
};

struct locationstruct
{
        int numFloor;
        int numRoom;
        unsigned char subLocation;
};

struct geninfostruct
{
        addressstruct address;
        char phoneNumber[12];
};

struct insuranceinfostruct
{
        char nameCarrier[32];
        geninfostruct insurancegeninfo;
        float deductable;
};

struct datestruct
{
        int day;
        int month;
        int year;
};

struct patientstruct
{
        namestruct namepatient;
        int age;
        geninfostruct geninfopatient;
        insuranceinfostruct insurence;
        datestruct dischargedate;
        locationstruct locationpatient;
        char information[1024];
};



char menu()
{
        char option1;
        do
        {
        system("cls");
        printf("press a coresponding key and then press enter to choose an option:\n1. open a file\n2. write database to file\n3. display patients\n4. find a patient\n5. add a patient\n6. delete a patient\n7. move a patient\n8.print out patients by discharge date\n");
        option1 = getchar();
        }
        while (option1<'1' || option1 > '7');
       
        fflush(stdin);
       
        return option1;
}

void addpatient(patientstruct (*patientstructpointer)[maxpatients], int (*count)=0)
{
        patientstruct patientstruct1[maxpatients];
        int numread;
        char yesno;
        FILE *fp;
        fp=fopen("c:\\patientdirectory.txt","r");
        if(fp==NULL)
        {
                printf("file not found. create one?y/n");
                fflush(stdin);
                do
                {
//                  scanf_s("%c",&yesno);
                        cin>>yesno;
                        switch(yesno)
                        {       
                                case 'y':
                                        break;
                                case 'n':
                                        main();
                                        break;
                                default:
                                        printf("please enter y for yes or n for no and press enter");
                                        break;
                        }
                }while(yesno!='y');
        }
        else
        {
                while (!feof(fp))
                {
                        numread = fread((patientstructpointer)[*count],sizeof(*patientstructpointer),1,fp);
                        (*count)++;
                }
        }


               





        system("cls");

        fflush(stdin);
        printf("\nEnter the patient's first name\n");
        gets_s((*patientstructpointer)[*count].namepatient.firstName);
        fflush(stdin);
        printf("\nEnter the patient's middle initial\n");
        (*patientstructpointer)[*count].namepatient.middleI=getchar();
        fflush(stdin);
        printf("\nEnter the patient's last name\n");
        gets_s((*patientstructpointer)[*count].namepatient.firstName);
        fflush(stdin);
        printf("\nEnter the patient's age\n");
        scanf_s("%d",&(*patientstructpointer)[*count].age);
        fflush(stdin);
        printf("\nEnter the patient's state of residence\n");
        gets_s((*patientstructpointer)[*count].geninfopatient.address.state);
        printf("\nEnter the patient's city of residence\n");
        gets_s((*patientstructpointer)[*count].geninfopatient.address.city);
        fflush(stdin);
        printf("\nEnter the patient's zipcode of residence\n");
        scanf_s("%d",&(*patientstructpointer)[*count].geninfopatient.address.zipcode);
        fflush(stdin);
        printf("\nEnter the patient's street address of residence\n");
        gets_s((*patientstructpointer)[*count].geninfopatient.address.streetAddress);
        fflush(stdin);
        printf("\nEnter the patient's phone number\n");
        gets_s((*patientstructpointer)[*count].geninfopatient.phoneNumber);
        fflush(stdin);
        printf("\nEnter the patient's insurance carrier's name\n");
        gets_s((*patientstructpointer)[*count].insurence.nameCarrier);
        fflush(stdin);
        printf("\nEnter the patient's insurance carrier's state\n");
        gets_s((*patientstructpointer)[*count].insurence.insurancegeninfo.address.state);
        fflush(stdin);
        printf("\nEnter the patient's insurance carrier's city\n");
        gets_s((*patientstructpointer)[*count].insurence.insurancegeninfo.address.city);
        fflush(stdin);
        printf("\nEnter the patient's insurance carrier's zipcode\n");
        scanf_s("%d",&(*patientstructpointer)[*count].insurence.insurancegeninfo.address.zipcode);
        fflush(stdin);
        printf("\nEnter the patient's insurance carrier's street address\n");
        gets_s((*patientstructpointer)[*count].insurence.insurancegeninfo.address.streetAddress);
        fflush(stdin);
        printf("\nEnter the patient's insurance carrier's deductable\n");
        scanf_s("%f",&(*patientstructpointer)[*count].insurence.deductable);
        fflush(stdin);
        printf("\nEnter the patient's year of discharge\n");
        scanf_s("%d",&(*patientstructpointer)[*count].dischargedate.year);
        fflush(stdin);
        printf("\nEnter the patient's month of discharge\n");
        scanf_s("%d",&(*patientstructpointer)[*count].dischargedate.month);
        fflush(stdin);
        printf("\nEnter the patient's day of discharge\n");
        scanf_s("%d",&(*patientstructpointer)[*count].dischargedate.day);
        fflush(stdin);
        printf("\nEnter the patient's floor number\n");
        scanf_s("%d",&(*patientstructpointer)[*count].locationpatient.numFloor);
        fflush(stdin);
        printf("\nEnter the patient's room number\n");
        scanf_s("%d",&(*patientstructpointer)[*count].locationpatient.numRoom);
        fflush(stdin);
        printf("\nEnter the patient's location number\n");
//location
        ((*patientstructpointer)[*count].locationpatient.subLocation)=1;
        int locationnumber;
        scanf_s("%d",&locationnumber);
                switch(locationnumber)
                {       
                case 1:
                        break;
                case '2':
                        ((*patientstructpointer)[*count].locationpatient.subLocation)=((*patientstructpointer)[*count].locationpatient.subLocation)<<1;
                        break;
                case '3':
                        ((*patientstructpointer)[*count].locationpatient.subLocation)=((*patientstructpointer)[*count].locationpatient.subLocation)<<2;
                        break;
                case '4':
                        ((*patientstructpointer)[*count].locationpatient.subLocation)=((*patientstructpointer)[*count].locationpatient.subLocation)<<3;
                        break;
                case '5':
                        ((*patientstructpointer)[*count].locationpatient.subLocation)=((*patientstructpointer)[*count].locationpatient.subLocation)<<4;
                        break;
                case '6':
                        ((*patientstructpointer)[*count].locationpatient.subLocation)=((*patientstructpointer)[*count].locationpatient.subLocation)<<5;
                        break;
                case '7':
                        ((*patientstructpointer)[*count].locationpatient.subLocation)=((*patientstructpointer)[*count].locationpatient.subLocation)<<6;
                        break;
                case '8':
                        ((*patientstructpointer)[*count].locationpatient.subLocation)=((*patientstructpointer)[*count].locationpatient.subLocation)<<7;
                        break;
                default:
                        printf("you're fired");
                }
        fflush(stdin);
        printf("\nEnter the patient's description (less than 1023 characters please)\n");
        gets_s((*patientstructpointer)[*count].information);
        fp=fopen("c:\\patientdirectory.txt","a");
/**/fwrite ((patientstructpointer)[*count],sizeof((*patientstructpointer)),1,fp);
}





void displaypatients()
{
        FILE *fp;
        fp=fopen("c:\\patientdirectory.txt","r");
        patientstruct (*patientstructpointer)[maxpatients];
        patientstruct (patientstruct1)[maxpatients];
        (patientstructpointer)=&(patientstruct1);
        int numread;
        int *count;
        int asa;
        count=&asa;
        asa=0;
        while (!feof(fp))
        {
                numread = fread((patientstructpointer)[*count],sizeof(*patientstructpointer),1,fp);
                fflush(stdin);
                printf("\npatient's first name\n");
/*ERROR*/              puts((*patientstructpointer)[*count].namepatient.firstName);
                fflush(stdin);
                printf("\npatient's middle initial\n");
                printf("%c",(*patientstructpointer)[*count].namepatient.middleI);
                fflush(stdin);
                printf("\npatient's last name\n");
                puts((*patientstructpointer)[*count].namepatient.firstName);
                fflush(stdin);
                printf("\npatient's age\n");
                printf("%d",(*patientstructpointer)[*count].age);
                fflush(stdin);
                printf("\npatient's state of residence\n");
                puts((*patientstructpointer)[*count].geninfopatient.address.state);
                printf("\npatient's city of residence\n");
                puts((*patientstructpointer)[*count].geninfopatient.address.city);
                fflush(stdin);
                printf("\npatient's zipcode of residence\n");
                printf("%d",(*patientstructpointer)[*count].geninfopatient.address.zipcode);
                fflush(stdin);
                printf("\npatient's street address of residence\n");
                puts((*patientstructpointer)[*count].geninfopatient.address.streetAddress);
                fflush(stdin);
                printf("\npatient's phone number\n");
                puts((*patientstructpointer)[*count].geninfopatient.phoneNumber);
                fflush(stdin);
                printf("\npatient's insurance carrier's name\n");
                puts((*patientstructpointer)[*count].insurence.nameCarrier);
                fflush(stdin);
                printf("\npatient's insurance carrier's state\n");
                puts((*patientstructpointer)[*count].insurence.insurancegeninfo.address.state);
                fflush(stdin);
                printf("\npatient's insurance carrier's city\n");
                puts((*patientstructpointer)[*count].insurence.insurancegeninfo.address.city);
                fflush(stdin);
                printf("\npatient's insurance carrier's zipcode\n");
                printf("%d",(*patientstructpointer)[*count].insurence.insurancegeninfo.address.zipcode);
                fflush(stdin);
                printf("\npatient's insurance carrier's street address\n");
                puts((*patientstructpointer)[*count].insurence.insurancegeninfo.address.streetAddress);
                fflush(stdin);
                printf("\npatient's insurance carrier's deductable\n");
                printf("%f",(*patientstructpointer)[*count].insurence.deductable);
                fflush(stdin);
                printf("\npatient's year of discharge\n");
                printf("%d",(*patientstructpointer)[*count].dischargedate.year);
                fflush(stdin);
                printf("\npatient's month of discharge\n");
                printf("%d",(*patientstructpointer)[*count].dischargedate.month);
                fflush(stdin);
                printf("\npatient's day of discharge\n");
                printf("%d",(*patientstructpointer)[*count].dischargedate.day);
                fflush(stdin);
                printf("\npatient's floor number\n");
                printf("%d",(*patientstructpointer)[*count].locationpatient.numFloor);
                fflush(stdin);
                printf("\npatient's room number\n");
                printf("%d",(*patientstructpointer)[*count].locationpatient.numRoom);
                fflush(stdin);
                printf("\npatient's location number\n");
//location
                int locationnumber;
                switch((*patientstructpointer)[*count].locationpatient.subLocation)
                {       
                        case 1:
                                locationnumber=1;
                                break;
                        case (1<<1):
                                locationnumber=2;
                                break;
                        case (1<<2):
                                locationnumber=3;
                                break;
                        case (1<<3):
                                locationnumber=4;
                                break;
                        case (1<<4):
                                locationnumber=5;
                                break;
                        case (1<<5):
                                locationnumber=6;
                                break;
                        case (1<<6):
                                locationnumber=7;
                                break;
                        case (1<<7):
                                locationnumber=8;
                                break;
                        default:
                                locationnumber=0;
                                printf("you're fired");
                        }
                        printf("%d",locationnumber);
                fflush(stdin);
                printf("\npatient's description (less than 1023 characters please)\n");
                puts((*patientstructpointer)[*count].information);
                (*count)++;
        }

                printf("\npress any key to continue\n");
                getchar();
}
       
       





void main()
{
        patientstruct patientstruct1[maxpatients];
        char entry;
        int count = 0;
        do
        {
                entry = menu();
                switch(entry)
                {              
                case '1':

                        break;
                case '2':

                        break;
                case '3':
                        displaypatients();
                        break;
                case '4':

                        break;
                case '5':
                        addpatient(&patientstruct1,&count);
                        break;
                case '6':

                        break;
                case '7':

                        break;
                case '8':

                        break;
                default:
                        printf("you're fired");
                }
        }
        while (entry != '7');   






for(;;);
}

Sponsor
Sponsor
Sponsor
sponsor
chopficaro




PostPosted: Sat May 10, 2008 9:02 pm   Post subject: RE:fread/fwrite

yo someone just gave me a hint but they were a little unspecific, he said "it probably didnt clean the buffer between READING the 1st file and inputing the SECOND file"
so how do i do that? FFLUSH(STDIN);? system("cls");?
btiffin




PostPosted: Sat May 10, 2008 9:47 pm   Post subject: RE:fread/fwrite

Have you tried tracing numread ? Make sure the fread is actually returning 1. And what kind of error message? Segfault? Is anything in ferror? Are you accounting for non-binary fopen? Have you looked closely at why you have an array of 8 pointers and an array of 8 structures. So many questions. Smile

Not to be mean, but this is C++, get used to the stream operators. They can be your friends and your source code will shrink quite a bit. Smile
chopficaro




PostPosted: Sat May 10, 2008 10:56 pm   Post subject: RE:fread/fwrite

numread returns a zero on the first patient and a 1 on the 2nd patient
btiffin




PostPosted: Sun May 11, 2008 4:56 pm   Post subject: Re: fread/fwrite

Ok, so the fread is "working", now where is it putting the data? And how does that differ from where you are puts'ing it from?

I'll have you explain to me what you expect from
code:

   patientstruct (*patientstructpointer)[maxpatients];
   patientstruct (patientstruct1)[maxpatients];
   (patientstructpointer)=&(patientstruct1);
and
code:

      numread = fread((patientstructpointer)[*count],sizeof(*patientstructpointer),1,fp);
      fflush(stdin);
      printf("\npatient's first name\n");
/*ERROR*/      puts((*patientstructpointer)[*count].namepatient.firstName);
      fflush(stdin);
when the count is 0, 1, 2.

And I'll hint that you have an array of 8 pointers to patientstruct and an allocation of 8 patientstruct s. Where is your pointer expression pointing to on the second fread? Where is your pointer dereference expression pointing to on the puts when count is 1? And also closely examine the arguments to fread; it is address, size, count, file right?

Stronger hint ... what is *patienstructpointer[1] ?
Another strong hint; put a tracer on sizeof(*patientstructpointer), the expression used in the fread's size argument.

To be honest ... I haven't C++'ed seriously for going on 10 years now. So this is not code I can look at and "see" quickly. But I have suspicions.

And it may be too late to get into for a Monday assignment deadline, but snag a copy of Ch from http://www.softintegration.com/ It will let you do C and (a little) C++ interactively. Nice system. But as it is a true interactive C, you may crash the interpreter on a fairly regular basis. I do when I experiment with complex pointer expression. Ch does not protect you from memory smashing. (Which is good ... it just means you have to start up the interpreter again). It also needs to be cycled if you EOF your streams or want to re chparse the standard stream headers. But it really is a great learning tool with much faster turn around times than normal edit/compile/link/go/crash/debug programming. Smile And it will actually compile, but I just use it to tinker so the interactive mode is pretty much all I use. And for Windows folks, it comes with a fairly complete set of Unixy command line tools, like bash, and vi. Not as stable as cygwin, when I run it on my cheesy old Win98 box, but "better" than command.com but a mile.

Cheers
Display posts from previous:   
   Index -> Programming, C++ -> C++ Help
View previous topic Tell A FriendPrintable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic

Page 1 of 1  [ 5 Posts ]
Jump to:   


Style:  
Search: