我正在使用fwrite()
并且fread()
第一次将一些数据结构写入磁盘,并且我有几个关于最佳实践和正确做事方式的问题。
我正在写入磁盘(以便以后可以将其读回)是插入到 Graph 结构中的所有用户配置文件。每个图顶点属于以下类型:
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()
在写字符串之前写出输出,但是有没有更好的方法没有额外的写?