我想将结构数组的二进制图像写入二进制文件。我已经试过了:

#include <stdio.h>
#include <string.h>
#define NUM 256

const char *fname="binary.bin";


typedef struct foo_s {
    int intA;
    int intB;
    char string[20];
}foo_t;



void main (void)
{
    foo_t bar[NUM];

    bar[0].intA = 10;
    bar[0].intB = 999;
    strcpy(bar[0].string,"Hello World!");

    Save(bar);
    printf("%s written succesfully!\n",fname);
}

int Save(foo_t* pData)
{
    FILE *pFile;
    int ptr = 0;
    int itr = 0;

    pFile = fopen(fname, "w");
    if (pFile == NULL) {
        printf("couldn't open %s\n", fname);
        return;
    }
    for (itr = 0; itr<NUM; itr++) {
        for (ptr=0; ptr<sizeof(foo_t); ptr++)
        {
            fputc((unsigned char)*((&pData[itr])+ptr), pFile);
        }
        fclose(pFile);
    }
}

但是编译器说的是aggregate value used where an integer was expected fputc((unsigned char)*((&pData[itr])+ptr), pFile);,我不太明白为什么,我做错了什么?
谢谢!

最佳答案

确保以二进制模式打开文件。

// pFile = fopen(fname, "w");
pFile = fopen(fname, "wb");

在索引之前将其转换为char *指针。原始代码通过sizeof(pData[itr])索引。[编辑]然后取消对类型的引用-然后尝试转换为unsigned char@R Sahu
//fputc((unsigned char)*((&pData[itr])+ptr), pFile);
unsigned char *p = (unsigned char *) (&pData[itr]);
fputc(p[ptr], pFile);

正如@R Sahu指出的那样:fclose()应该移到循环之外。
未成年人:
建议将NUM作为参数传递给save()
foo_t bar[NUM];未完全初始化。
非循环解决方案是
if (fwrite(pData, sizeof(*pData), NUM, pFile) == NUM) Success();

建议进行const:`int Save(const foo*pData)
对于size_t&ptr

关于c - 如何将结构数组的二进制副本写入文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25417816/

10-14 17:43
查看更多