我想将结构数组的二进制图像写入二进制文件。我已经试过了:
#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/