【问题标题】:Stuck at using arrays and struct in C坚持在 C 中使用数组和结构
【发布时间】:2021-12-30 05:06:16
【问题描述】:

您好,我目前正在开发一个程序,该程序必须能够让客户介绍球员或球队,并且数据必须以 txt、姓名、id 等形式保存。

在我不得不在程序中使用结构系统之前,一切都运行良好,因为它说我使用的数组与 fgets 不兼容。

{
    int i=0;
    FILE *equipos;
    equipos=fopen("BaseDatos/equipos.txt", "rt");//Lee los equipos guardados en el fichero
    if(equipos==NULL)
    {
        borraVentana(20,26,100,2);
        rectangulo(19,25,99,1);
        gotoxy( 26,26);
        printf( "Error en el archivo");
        fflush(stdin);
        getchar();
        return -1;
    }
    else
    {
        while(fscanf(equipos, "%d", Equipos[i])==1)//El bucle indica que el archivo se leera hasta que no haya ningún entero registrado en id_equipo
        {
            fgets(Equipos[i], 40-1, equipos);

            i++;
        }
        fclose(equipos);
        return i;//Devuelve el valor i siendo este el numero de equipos registrados
    }
}

不起作用的行是fgets(Equipos[i], 40-1, equipos);,我尝试将其更改为fscanf,但它也不起作用,它一直显示相同的错误:

错误:'fgets' 的参数 1 的类型不兼容。

有人知道我做错了什么吗?

谢谢。

编辑:

sEquipo的组成是:

#define EQUIPO_H_INCLUDED

#define DIM_NOMBRE_EQUIPO 40

struct sEquipo
{
    int id_equipo;
    char nombre[DIM_NOMBRE_EQUIPO];
};


#endif // EQUIPO_H_INCLUDED```

It's supposed to take out from a txt the names of the teams so it can go to another function to use it.

【问题讨论】:

  • fgets 读取 strings(指向 char 的指针),我们可以假设(因为我们没有看到声明或定义)是 @987654328 @ 是指向 int 的指针。假设是因为这就是您在调用fscanf 时使用Equipos[i] 的方式。请尝试创建一个minimal reproducible exampleedit 你的问题来展示它。
  • 如果不是秘密,能否提供Equipos结构的定义。
  • 正如一些程序员老兄已经说过的那样,fgets 不会从文件中读取“结构”,而是从字符串中读取(准确地说是一行)。我相信fread 更符合您想要实现的目标。
  • 您应该在 fgets 中将 Equipos[i] 更改为 Equipos[i]->nombre,并可能在 fscanf 中更改为 &Equipos[i]->id_equipo,这样您就可以从文件中读取到结构中的正确字段

标签: arrays c struct codeblocks


【解决方案1】:

您对结构和数组的理解似乎存在缺陷。

结构是任意数量的任意类型的组合,使用. 运算符访问各个成员。

因此,为了阅读结构,您需要单独对待每个成员。

while(fscanf(equipos, "%d", &Equipos[i].id_equipo)==1)
{
    fgets(Equipos[i].nombre, 40-1, equipos);
    i++;
}
fclose(equipos);

fscanf 现在将获取成员变量 id_equipo 的地址(注意 &),而 fgets 获取字符数组 nombre 的地址(在这种情况下,& 不是必需的,数组自动衰减到指针)。

如果Equipos 不是一个数组(很难从你的sn-p 中分辨出来),而是一个指向结构的指针数组,那么. 需要替换为->

或者,如果您希望对二进制文件进行操作而不关心文件中的多余字节,则可以使用fread 将整个结构读入内存。请注意,如果您这样做,您还必须使用相同的结构编写文件。如果您稍后决定扩展您的数组或更改其结构,那么您为它们创建的所有文件都将不兼容。

但是,为了完整起见,如果您想一口气阅读整个结构,这是您的阅读代码:

while (fread(&Equipos[i], 1, sizeof(sEquipo), equipos) == sizeof(sEquipo))
    ++i;

如果你想使用它,你需要将 fopen 模式更改为 rb

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多