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? Multiple fwrite()'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 used strlen() to write them. I could write the output of strlen() before writing the string, but is there any better way without extra writes?