0

使用 fwrite,我正在编写整个结构?我们在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);
}
4

2 回答 2

1

从概念上讲,你的方法会奏效。但是,您的代码存在一些问题:

(1)structarray被声明为自动变量(在堆栈上分配)。没有理由调用calloc()每个数组元素;数组已经完全分配。也许您打算初始化数组元素(例如memset(),等)。

(2)fopen()返回指向已打开文件的指针,但您没有将返回值分配给F1. 结果,F1保持未初始化,因此调用fwrite()将不起作用。

(3) 如果您打算将完整的结构数组保存到文件中(而不是特定元素),请将您的调用更改fwrite()为如下:

fwrite(structarray, sizeof(mystruct), size, F1);

(4) 始终检查返回值 fromfwrite()以确保它成功。

于 2013-02-28T15:59:24.543 回答
1

structarray[0].field1是一个int,但第一个参数fwritevoid*。采用

fwrite(structarray, sizeof(mystruct), size, F1);

或者,我更喜欢

fwrite(structarray, sizeof *structarray, size, F1);

因为它没有耦合到类型structarray和减少耦合是一件好事。你甚至可以做

fwrite(structarray, sizeof structarray, 1, F1);

只要structarray是真正的数组而不是指针。

您应该检查fwrite. 并以设置为高的警告级别进行编译......编译器应该警告您尝试传递intto fwrite,以及

structarray[i]=calloc(1,sizeof(mystruct));

which isn't legit ... structarray[i] is a mystruct but calloc returns a pointer. See aardvarkk's comment under your question. It should also tell you that you used F1 without ever setting it.

于 2013-02-28T16:08:06.640 回答