【问题标题】:Output struct objects to binary file and input from it back in C [duplicate]将结构对象输出到二进制文件并从它输入回C [重复]
【发布时间】:2016-10-21 18:04:50
【问题描述】:

我用 C 编写管理系统。 我有这个结构

#define STRING_LENGTH 32
typedef struct {
    char name[STRING_LENGTH];
} Name;

typedef struct{
    int id, balance;
    Name clientName;
} Client;

我创建了几个测试对象,打开二进制文件进行写入,使用fwrite 将对象写入文件,关闭它,然后使用fread 进入while(!feof... 块,我的问题是我打印4个对象到二进制文件,当我从文件中读取对象并将其打印到屏幕上时,最后一个对象打印了两次。 我做错了什么?我只需要将对象写入文件,然后从中取回。

我的代码:

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;

输出照片:screen of output

感谢回答

【问题讨论】:

    标签: c binary feof


    【解决方案1】:

    我的方法是这样做。如果您阅读了正确数量的记录,则可以,如果没有,请退出。无需涉及feof()

    while(fread(&getUser, sizeof(Client), 1, clientsFile) == 1) {
        printf("ID : %d, Name : %s, Balance : %d\n", getUser.id, getUser.clientName.name, getUser.balance);
    }
    

    【讨论】:

      【解决方案2】:

      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));
      

      【讨论】:

        【解决方案3】:

        这是因为你正在使用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));
        

        在这种情况下,当你第五次阅读时,你会得到 EOF。但是“getUser”仍然有第四个客户端条目。所以你得到最后一次输出两次。

        解决方案: 改为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);
        }
        

        【讨论】:

        • 调用 fread() 时出现错误怎么办? AFAICT,feof() 将返回 0,程序将陷入永恒循环,对吧?
        • 不是很优雅,因为你在两个不同的地方有完全相同的fread
        • 比约娜。和迈克尔,我同意这两点。谢谢你。我更新了我的答案。现在还好吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多