fwrite()
およびを使用fread()
して初めてデータ構造をディスクに書き込みますが、ベスト プラクティスと適切な方法についていくつか質問があります。
ディスクに書き込んでいるのは (後で読み戻せるようにするため)、グラフ構造に挿入されたすべてのユーザー プロファイルです。各グラフ頂点は次のタイプです。
typedef struct sUserProfile {
char name[NAME_SZ];
char address[ADDRESS_SZ];
int socialNumber;
char password[PASSWORD_SZ];
HashTable *mailbox;
short msgCount;
} UserProfile;
そして、これは私が現在すべてのプロファイルをディスクに書き込んでいる方法です:
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);
}
ノート:
- 最初
fwrite()
に表示されるグラフには合計ユーザー数が表示されるので、読み返す必要があるデータの量がわかります。 - は
break
テスト用です。何千人ものユーザーがいて、私はまだコードを試しています。
私の質問:
- これを読んだ後
fwrite()
、構造全体を書くのではなく、各要素で使用することにしました。また、そのポインターを保存する必要がないため、ポインターをメールボックスに書き込むことも避けます。それで、これは行く方法ですか?fwrite()
構造全体のグローバルなものではなく、複数の ? 遅くないですか? - このコンテンツを読み返すにはどうすればよいですか? 使用する必要
fread()
があることはわかっていますが、文字列のサイズはわかりません。以前は文字列strlen()
を書いていたからです。文字列を書き込む前にの出力を書き込むことはできますが、strlen()
余分な書き込みを行わないより良い方法はありますか?