Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构可以吗?_C_Struct_Typedef - Fatal编程技术网

C结构可以吗?

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

用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[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缓冲区复制到内核的磁盘缓冲区,但除非您告诉系统进行同步写入,否则不会检测到磁盘已满。