0

Hi,

I have looked on boards, googled, I tried you tube had a look at the C books I have on hand.. but I am confused about this...

What is the best way to write a struct to a file_ And how is the data saved and then read back? Can someone help me out with an explanation? If you know a good page on beginner file reading/writing in C, I would love to know about it...

Thanks,
Nate

5
Contributors
15
Replies
19
Views
7 Years
Discussion Span
Last Post by nateuni
0

One function to write the struct to a file.
Another function to read the struct from a file.

For each field, use the appropriate fprintf or fscanf conversion function.

For extra robustness on reading, use fgets() to begin with.

0

So with my struct -

typedef struct
{
char firstName[15];
char surname[15];
int age;
float height;
float weight;
float bmi;
float bfpercentage;
char significantInjury;
char unableToExercise;
int seekMedicalApproval;
int hadDrApproval;
int dateOfApproval;

}clientData;

But how is the information saved and read? I can only find information related to strings.. but how do i save the ints etc? and then get them back? Do I need some type of format specifier?

Thanks again.

0

One way:

/** Comma separated, for example. */
void record_write(FILE *file, const clientData *cd)
{
   fprintf(file, "%s,", cd->firstName);
   fprintf(file, "%s,", cd->surname);
   fprintf(file, "%d,", cd->age);
   fprintf(file, "%f,", cd->height);
   fprintf(file, "%f,", cd->weight);
   fprintf(file, "%f,", cd->bmi);
   fprintf(file, "%f,", cd->bfpercentage);
   fprintf(file, "%c,", cd->significantInjury);
   fprintf(file, "%c,", cd->unableToExercise);
   fprintf(file, "%d,", cd->seekMedicalApproval);
   fprintf(file, "%d,", cd->hadDrApproval);
   fprintf(file, "%d,", cd->dateOfApproval);
   fprintf(file, "\n");
}
0

One way:

/** Comma separated, for example. */
void record_write(FILE *file, const clientData *cd)
{
   fprintf(file, "%s,", cd->firstName);
   fprintf(file, "%s,", cd->surname);
   fprintf(file, "%d,", cd->age);
   fprintf(file, "%f,", cd->height);
   fprintf(file, "%f,", cd->weight);
   fprintf(file, "%f,", cd->bmi);
   fprintf(file, "%f,", cd->bfpercentage);
   fprintf(file, "%c,", cd->significantInjury);
   fprintf(file, "%c,", cd->unableToExercise);
   fprintf(file, "%d,", cd->seekMedicalApproval);
   fprintf(file, "%d,", cd->hadDrApproval);
   fprintf(file, "%d,", cd->dateOfApproval);
   fprintf(file, "\n");
}

Hey thanks a lot.. I will give it a try tomorrow and see if i can get it to work correctly...

Thanka again guys,
Nate

0

I am not sure what I am doing wrong (do i need to create the file first?? If so where do I import it into in Netbeans?)... currently I am unable to get the method to save.

int main(int argc, char** argv)
{
    const clientData *cd;
    clientData client;
    FILE *client_file;

    programIntroduction();
    profileWizard(&client);
    healthScreening(&client);
    saveToFile(*client_file, *cd);

    return (EXIT_SUCCESS);
}

saveToFile(FILE *write_client_data, const clientData *cd)
{
    write_client_data = fopen( "mt_client_file.txt", "w" );
    if( write_client_data != NULL )
    {
        fprintf(write_client_data, "%s,", cd->firstName);
        fprintf(write_client_data, "%s,", cd->surname);
        fprintf(write_client_data, "%d,", cd->age);
        fprintf(write_client_data, "%f,", cd->height);
        fprintf(write_client_data, "%f,", cd->weight);
        fprintf(write_client_data, "%f,", cd->bmi);
        fprintf(write_client_data, "%f,", cd->bfpercentage);
        fprintf(write_client_data, "%c,", cd->significantInjury);
        fprintf(write_client_data, "%c,", cd->unableToExercise);
        fprintf(write_client_data, "%d,", cd->seekMedicalApproval);
        fprintf(write_client_data, "%d,", cd->hadDrApproval);
        fprintf(write_client_data, "%d,", cd->dateOfApproval);
        fprintf(write_client_data, "\n");
    }
}

Here is the error message - /Applications/NetBeans/NetBeans 6.7.1.app/Contents/Resources/NetBeans/dlight1/bin/nativeexecution/dorun.sh: line 51: 18665 Bus error /bin/sh "${PIDFILE}.sh"

0

ops and yes there is a void on the front of the saveToFile Method... sorry i missed it out when cutting and pasting..

0

> saveToFile(*client_file, *cd);
Neither client_file or cd are initialised.

Something like this

client_file = fopen("data.txt","w");
if ( client_file != NULL ) {
    saveToFile(*client_file, &client);
    fclose( client_file );
}

Oh, and make sure you prototype your functions before calling them.
Had you done so, this would have generated warnings.

Actually, I'm surprised it didn't anyway.

0

if you do not have problem with binary file then you can try saving and reading struct using fwrite and fread function

// Saving structure in file
//fwrite(structure variable address,size of structure,number of records,File pointer);


fwrite(&clientData_var,sizeof(clientData),1,FILE_POINTER);

same signature for fread...

0

I am closer but i still can't get it to work.. I am new to pointers and I am finding them very confusing!!

Here is the code -

typedef struct
{
    char  firstName[15];
    char  surname[15];
    int   age;
    float height;
    float weight;
    float bmi;
    float bfpercentage;
    char  significantInjury;
    char  unableToExercise;
    int   seekMedicalApproval;
    int   hadDrApproval;
    int   dateOfApproval;
    
}clientData;

#include <stdio.h>
#include <stdlib.h>

void saveToFile(FILE *write_client_data, const clientData *cd);

int main(int argc, char** argv)
{
    const clientData *cd;
    clientData client;

    FILE *client_file = fopen( "mt_client_file.txt", "w" );

    programIntroduction();
    profileWizard(&client);
    healthScreening(&client);
    saveToFile(*client_file, &client);
    fclose(client_file);

    return (EXIT_SUCCESS);
}

void saveToFile(FILE *write_client_data, const clientData *cd)
{
    printf("Into file nethod...\n");
    //write_client_data = fopen( "mt_client_file.txt", "w" );
    if( write_client_data != NULL )
    {
        fprintf(write_client_data, "%s,", cd->firstName);
        fprintf(write_client_data, "%s,", cd->surname);
        fprintf(write_client_data, "%d,", cd->age);
        fprintf(write_client_data, "%f,", cd->height);
        fprintf(write_client_data, "%f,", cd->weight);
        fprintf(write_client_data, "%f,", cd->bmi);
        fprintf(write_client_data, "%f,", cd->bfpercentage);
        fprintf(write_client_data, "%c,", cd->significantInjury);
        fprintf(write_client_data, "%c,", cd->unableToExercise);
        fprintf(write_client_data, "%d,", cd->seekMedicalApproval);
        fprintf(write_client_data, "%d,", cd->hadDrApproval);
        fprintf(write_client_data, "%d,", cd->dateOfApproval);
        fprintf(write_client_data, "\n");
    }
    else
    {
        printf("Error reading file...");
    }
}

here is the error message from the function call in the main()-

ICT106_A1.c:45: error: incompatible type for argument 1 of ‘saveToFile’

0

Change this line:

saveToFile(*client_file, &client);

to this:

saveToFile(client_file, &client);

In addition to this, you should also check that the call to fopen() is successful - Salem gave you the code for this check in post #8.
Good luck!

0

awesome that is working now...

Do read it in do I just reverse all the statements and user fscanf?

0

Since the whole line will be a string, you won't want to use %s for the strings with fscanf ; instead you'd probably want %14[^,] . The arguments to fscanf will be pointers, so watch out for that too.

Do read it in do I just reverse all the statements and user fscanf?

And I'm not quite sure what you mean by "reverse", so I'll say 'no'. The fscanf code will look a lot like the fprintf code -- with the exceptions of the strings and the pointer arguments.

0

You called from main() like
saveToFile(*client_file, &client); //at 33 line
but you should call this function as
saveToFile(client_file, &client);

this may be solve your problem..........

0

You called from main() like
saveToFile(*client_file, &client); //at 33 line
but you should call this function as
saveToFile(client_file, &client);

this may be solve your problem..........

It already did solve the problem sunshine. Refer to post #11!

0

It already did solve the problem sunshine. Refer to post #11!

But I need to check in case he is right... as I ran the program in Netbeans and it compiled and saved to file.. but there is the chance that if i ran it in with a a lot of extra checking like -Wall -Werrer that it would produce warnings... so I will do that and get back to the thread,.. I am just working on some HTML right now.

Thanks again guys..
Nate

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.