将struct对象输出到二进制文件并从C

时间:2016-10-21 18:04:51

标签: c binary feof

我在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

感谢答案

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:2)

我的方式就是这样做。如果您读取了正确的记录数,那么很好,如果没有,则退出。无需涉及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 :(得分:1)

这是因为你正在使用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"仍然有第四个客户端条目。所以你得到最后一次输出。

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