【问题标题】:Copy a list to a binary file将列表复制到二进制文件
【发布时间】:2016-02-06 15:52:57
【问题描述】:

我正在尝试将列表中结构的内容复制到二进制文件中。

这是我的结构声明:

typedef struct
{
    char dni[9];
    char nombre[100], apellido[100];
    double deuda;
} t_datos;

struct s_nodo
{
    t_datos dati;
    struct s_nodo *sig;
};
typedef struct s_nodo *t_nodo;
void newfile(t_nodo, FILE *);

主要是我用 .dat 文件中的一些数据填充列表,看起来没问题,因为如果我打印列表一切正常。当我尝试复制我的结构时遇到问题列表到一个新的二进制文件。

//open and copy old binary file to the list...
fc = fopen("c:\\norep.dat", "w+b");
if (fc == NULL)
{
    puts("Error");
    exit(-1);
}
newfile(lista, fc);

这是我的功能:

void newfile(t_nodo lista, FILE *fc)
{
    if (lista != NULL) 
    {
        fwrite(lista->dati, sizeof(t_datos), 1, fc);
        newfile(lista->sig, fc);
    }
}

我得到的错误是:

错误:'fwrite' 的参数 1 的类型不兼容|

我知道错误可能在于我将列表传递给函数的方式,我看到了 fwrite 的原型,但我不知道应该如何修复代码。

【问题讨论】:

    标签: c list file data-structures


    【解决方案1】:

    fwrite() 的第一个参数必须是一个指针(const void *准确地说),在你的情况下它不是。你必须使用&运营商的地址,像这样

    fwrite(&lista->dati, sizeof(lista->dati), 1, fc);
    

    此外,您可能需要检查 fwrite() 的返回值以确保它成功,在这种情况下,由于您正在编写单个项目,因此它必须是 1

    警告:不要typedef poitners,将来可能会出现问题。如果必须,请使用诸如后缀 _ptr 之类的符号来表示它是一个指针(libxml-2.0 使用 Ptr 例如)。

    【讨论】:

    • 现在效果很好,但是我对在这个函数中使用指针仍然有些困惑;在我的主要声明中,我将 lista 声明为: t_nodo lista=NULL;在我的 struct t_nodo 中是一个指向 struct s_nodo 的指针,所以 lista 不是指针?为什么我必须添加 & 运算符?
    • 你很困惑,因为你 typedefed 它。声明时,指针必须在标识符附近有一个*,这很好。 t_datos 不是指针,它是用于存储数据的匿名 struct 的别名。 t_datos *dati 将使 dati 成为一个指针。但是你需要malloc() 为其分配空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2020-12-29
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多