提问人:Alex S 提问时间:10/22/2016 更新时间:10/22/2016 访问量:183
将结构对象输出到二进制文件,然后从中输入回 C [duplicate]
Output struct objects to binary file and input from it back in C [duplicate]
问:
我用C语言编写管理系统。 我有这个结构
#define STRING_LENGTH 32
typedef struct {
char name[STRING_LENGTH];
} Name;
typedef struct{
int id, balance;
Name clientName;
} Client;
我创建了几个测试对象,打开二进制文件进行写入,用于将对象写入文件,关闭它,然后使用 into 块,我的问题是我将 4 个对象打印到二进制文件,当我从文件中读取对象并将其打印到屏幕时,最后一个对象打印了两次。
我做错了什么?我只需要将对象写入文件,然后从中取回它们。fwrite
fread
while(!feof...
我的代码:
FILE *clientsFile = NULL;
switch (selectedOption)
{
case CLIENT:
clientsFile = fopen(CLIENTS_FILE_PATH, "wb");
Client getUser;
Client temp1 = { 1, 10000, "Alex" };
Client temp2 = { 2, 100000, "Valery" };
Client temp3 = { 3, 105466, "Jack" };
Client temp4 = { 4, 1069640, "Pam" };
fwrite(&temp1, sizeof(Client), 1, clientsFile);
fwrite(&temp2, sizeof(Client), 1, clientsFile);
fwrite(&temp3, sizeof(Client), 1, clientsFile);
fwrite(&temp4, sizeof(Client), 1, clientsFile);
fclose(clientsFile);
clientsFile = fopen(CLIENTS_FILE_PATH, "rb");
do
{
fread(&getUser, sizeof(Client), 1, clientsFile);
printf("ID : %d, Name : %s, Balance : %d\n", getUser.id, getUser.clientName.name, getUser.balance);
} while (!feof(clientsFile));
break;
输出照片:输出屏幕
谢谢你的回答
答:
2赞
jxh
10/22/2016
#1
feof()
如果引发了文件结束指示器标志,则返回 true。成功的呼叫不会导致升旗。因此,在读取最后一条记录后,您再迭代一次。fread()
相反,请检查是否成功,以确定是否已到达文件末尾或遇到其他错误。fread()
do
{
if (fread(&getUser, sizeof(Client), 1, clientsFile) == 1) {
printf("ID : %d, Name : %s, Balance : %d\n", getUser.id, getUser.clientName.name, getUser.balance);
} else {
/* do something */
}
} while (!feof(clientsFile));
1赞
MayurK
10/22/2016
#2
这是因为您正在使用 do-while。
do
{
fread(&getUser, sizeof(Client), 1, clientsFile);
printf("ID : %d, Name : %s, Balance : %d\n", getUser.id, getUser.clientName.name, getUser.balance);
} while (!feof(clientsFile));
在这种情况下,当您第 5 次阅读时,您会得到 EOF。但是“getUser”仍然有第 4 个客户端条目。因此,您会得到两次最后的输出。
溶液: 将其更改为 while 循环。
while (fread(&getUser, sizeof(Client), 1, clientsFile) && !feof(clientsFile))
{
printf("ID : %d, Name : %s, Balance : %d\n", getUser.id, getUser.clientName.name, getUser.balance);
}
评论
0赞
Bjorn A.
10/22/2016
如果在调用 fread() 时发生错误会发生什么?AFAICT,feof() 将返回 0,程序将陷入永恒循环,对吧?
0赞
Jabberwocky
10/22/2016
不是很优雅,因为你在两个不同的地方有完全相同的东西。fread
0赞
MayurK
10/22/2016
比约纳。和米歇尔,我同意这两点。谢谢。我更新了我的答案。现在还好吗?
2赞
Weather Vane
10/22/2016
#3
我的方式就是这样做。如果您读取了正确数量的记录,则可以,如果没有,请退出。没有必要参与。feof()
while(fread(&getUser, sizeof(Client), 1, clientsFile) == 1) {
printf("ID : %d, Name : %s, Balance : %d\n", getUser.id, getUser.clientName.name, getUser.balance);
}
评论