Hi,
I'm using fwrite()
and fread()
for the first time to write some data structures to disk and I have a couple of questions about best practices and proper ways of doing things.
What I'm writing to disk (so I can later read it back) is all user profiles inserted in a Graph structure. Each graph vertex is of the following type:
typedef struct sUserProfile {
char name[NAME_SZ];
char address[ADDRESS_SZ];
int socialNumber;
char password[PASSWORD_SZ];
HashTable *mailbox;
short msgCount;
} UserProfile;
And this is how I'm currently writing all the profiles to disk:
void ioWriteNetworkState(SocialNetwork *social) {
Vertex *currPtr = social->usersNetwork->vertices;
UserProfile *user;
FILE *fp = fopen("save/profiles.dat", "w");
if(!fp) {
perror("fopen");
exit(EXIT_FAILURE);
}
fwrite(&(social->usersCount), sizeof(int), 1, fp);
while(currPtr) {
user = (UserProfile*)currPtr->value;
fwrite(&(user->socialNumber), sizeof(int), 1, fp);
fwrite(user->name, sizeof(char)*strlen(user->name), 1, fp);
fwrite(user->address, sizeof(char)*strlen(user->address), 1, fp);
fwrite(user->password, sizeof(char)*strlen(user->password), 1, fp);
fwrite(&(user->msgCount), sizeof(short), 1, fp);
break;
currPtr = currPtr->next;
}
fclose(fp);
}
Notes:
- The first
fwrite()
you see will write the total user count in the graph so I know how much data I need to read back. - The
break
is there for testing purposes. There's thousands of users and I'm still experimenting with the code.
My questions:
- After reading this I decided to use
fwrite()
on each element instead of writing the whole structure. I also avoid writing the pointer to to the mailbox as I don't need to save that pointer. So, is this the way to go? Multiplefwrite()
's instead of a global one for the whole structure? Isn't that slower? - How do I read back this content? I know I have to use
fread()
but I don't know the size of the strings, cause I usedstrlen()
to write them. I could write the output ofstrlen()
before writing the string, but is there any better way without extra writes?