C结构可以吗?
用fwrite,我在写整个结构?w、 e在f1和f2中?任何帮助都将不胜感激C结构可以吗?,c,struct,typedef,C,Struct,Typedef,用fwrite,我在写整个结构?w、 e在f1和f2中?任何帮助都将不胜感激 typedef struct { int field1; int field2; }mystruct; int main(int argc,char *argv[]) { int size=2; mystruct structarray [size]; int i=0; for (i=0;i<size;i++) { structarray
typedef struct {
int field1;
int field2;
}mystruct;
int main(int argc,char *argv[])
{
int size=2;
mystruct structarray [size];
int i=0;
for (i=0;i<size;i++)
{
structarray[i]=calloc(1,sizeof(mystruct));
}
FILE *F1;
if (fopen("structfile","wt")==NULL){
err_sys("cannot be opened");
}
i=0;
for (i=0;i<size;i++)
{
structarray[i].field1=i;
}
fwrite(structarray[0].field1,sizeof(mystruct),size,F1);
fclose(F1);
}
typedef结构{
int field1;
int field2;
}我的结构;
int main(int argc,char*argv[])
{
int size=2;
mystruct structarray[size];
int i=0;
对于(i=0;i,您的方法在概念上是可行的。但是,您的代码存在一些问题:
(1) structarray
被声明为一个自动变量(在堆栈上分配)。没有理由为每个数组元素调用calloc()
;数组已经完全分配。可能您的意思是初始化数组元素(例如,memset()
,等等)
(2) fopen()
返回指向已打开文件的指针,但您没有将返回值赋给F1
。因此,F1
保持未初始化状态,因此对fwrite()
的调用将不起作用
(3) 如果要将完整的结构数组保存到文件中(与特定元素相反),请将调用更改为fwrite()
,如下所示:
fwrite(structarray, sizeof(mystruct), size, F1);
(4) 始终检查fwrite()
的返回值以确保其成功。structarray[0]。field1
是一个int
,但fwrite
的第一个参数是void*
。请使用
fwrite(structarray, sizeof(mystruct), size, F1);
或者,我更喜欢
fwrite(structarray, sizeof *structarray, size, F1);
因为它没有耦合到structarray
的类型,减少耦合是一件好事。你甚至可以这样做
fwrite(structarray, sizeof structarray, 1, F1);
只要structarray
是真正的数组而不是指针
您应该检查fwrite
的返回值,并在警告级别设置为高的情况下编译…编译器应该警告您试图将int
传递给fwrite
,以及
structarray[i]=calloc(1,sizeof(mystruct));
这是不合法的…structarray[i]
是一个mystruct
但calloc
返回一个指针。请参阅您问题下的aardvarkk注释。它还应该告诉您使用F1时从未设置过它。我猜这不是您的问题,但您已经静态地分配了这两个mystruct
结构——您不需要调用calloc
在堆上分配更多。我可能会用“wb”打开文件来写入二进制文件,因为您没有进行任何fprintf格式的打印。顺便说一句,可以写入/读取二进制数据,这看起来就像您正在做的一样。只是不要尝试以“文本”的形式读取二进制数据因为二进制数据中可能有0个值,这会混淆std C字符串函数。请始终检查fwrite
的值以及fclose
的值。例如,在磁盘已满的情况下,可能会使fwrite
成功(只是在缓冲区中写入),而fclose
失败。“从概念上讲,您的方法会起作用”--不,这是未定义的行为…试图将structarray[0].field1
的值转换为指针。@6502 fclose会将内存中的stdio缓冲区复制到内核的磁盘缓冲区,但除非您告诉系统进行同步写入,否则不会检测到磁盘已满。