将数据从文件写入C上的结构

将数据从文件写入C上的结构,c,file,struct,fwrite,fread,C,File,Struct,Fwrite,Fread,我有一个文件,我想从中读取以前由另一个程序创建的数据,但我得到了一个分段错误。这是程序 typedef char Telemento[MAX_CHAR+5]; typedef struct{ Telemento arraycola[NUM_ELEM]; int inicio; int final; }TCola; typedef char TNombreImpresora[MAX_NOM_IMPR]; typedef struct{ TNombreImpresora

我有一个文件,我想从中读取以前由另一个程序创建的数据,但我得到了一个分段错误。这是程序

typedef char Telemento[MAX_CHAR+5];

typedef struct{
   Telemento arraycola[NUM_ELEM];
   int inicio;
   int final;
}TCola;

typedef char TNombreImpresora[MAX_NOM_IMPR];

typedef struct{
   TNombreImpresora nombreimpresora;
   int numerodeficherosencola;
   TCola colaImpresora;
}TImpresora;

typedef struct{
   TImpresora impresora;
   int ocupado;
}TCelda;

typedef TCelda Tlistaimpresora[MAX_IMPR];



int main(){
    FILE *fp;
    int i=0;
    Tlistaimpresora listaimpresoras;



    fp=fopen("test.bin", "r");

    while(feof(fp)==0 && i<4){
       fread(&listaimpresoras[i].impresora, sizeof(listaimpresoras[i].impresora), (i+1), fp);
       listaimpresoras[i].ocupado=1;
       i++;
    }
    fclose(fp);


    return 0;   
}
typedef char Telemento[MAX_char+5];
类型定义结构{
塔莱门托·阿雷科拉[NUM_ELEM];
国际组织;
int最终版本;
}TCola;
typedef char tnombreimpersora[最大名称];
类型定义结构{
特努姆布雷·普雷索拉·诺姆布雷·普雷索拉;
int numeriodeficherosenscola;
科莱姆普雷索拉;
}蒂姆普雷索拉;
类型定义结构{
蒂姆普雷索拉;
国际奥库帕多;
}特切尔达;
类型定义TCelda TlistaImpersora[最大改进];
int main(){
文件*fp;
int i=0;
利斯塔伊姆普雷索拉斯;
fp=fopen(“试验箱”、“r”);

虽然(feof(fp)=0&&i我认为这行有一个错误(应该是
1
,而不是
i+1
):


我认为此行有错误(应该是
1
,而不是
I+1
):

改变这个

fread(&listaimpresoras[i].impresora, sizeof(listaimpresoras[i].impresora), (i+1), fp);
用这个

fread(&listaimpresoras[i].impresora, sizeof(listaimpresoras[i].impresora), 1, fp);
您没有阅读
i+1
项,只需更改此项即可

fread(&listaimpresoras[i].impresora, sizeof(listaimpresoras[i].impresora), (i+1), fp);
用这个

fread(&listaimpresoras[i].impresora, sizeof(listaimpresoras[i].impresora), 1, fp);
您不是在阅读
i+1
项目,而是在
fread
调用中用
1
替换
(i+1)

同时将
[1]
更改为
[i]

发生的情况是,每次读取都变大,最后一次读取溢出数组

您需要的是将相同大小的数据读入不同的数组元素。

fread
调用中将
(i+1)
替换为
1

同时将
[1]
更改为
[i]

发生的情况是,每次读取都变大,最后一次读取溢出数组

您需要的是将相同大小的数据读入不同的数组元素。

此行:

fread(&listaimpresoras[i].impresora, sizeof(listaimpresoras[i].impresora), (i+1), fp);
这有点奇怪,有几个原因:

1) 您只能读取结构的一个实例

2) 实际大小应该是结构的大小,而不是某个数组项的大小

建议:

fread(&listaimpresoras[i].impresora, sizeof(Tlistaimpresora), 1, fp);
此外,混乱的typedef声明使代码非常混乱 所有这些typedef将使代码比 必要的。只需使用适当的 每个字段(或字段组)的实例数此行:

fread(&listaimpresoras[i].impresora, sizeof(listaimpresoras[i].impresora), (i+1), fp);
这有点奇怪,有几个原因:

1) 您只能读取结构的一个实例

2) 实际大小应该是结构的大小,而不是某个数组项的大小

建议:

fread(&listaimpresoras[i].impresora, sizeof(Tlistaimpresora), 1, fp);
此外,混乱的typedef声明使代码非常混乱 所有这些typedef将使代码比 必要的。只需使用适当的
每个字段(或字段组)的实例数)

您是否认为“i”是文件数据指针?Cf.函数调用“feof()”仅在读取关联文件后有效。最好使用fread()返回的值要控制while循环,请检查
fopen
的结果。如果失败,它将返回
NULL
,并且您仍尝试从中读取。您是否认为“i”是文件数据指针?Cf。函数调用“feof()”仅在从关联文件读取后才有效。最好使用fread()返回的值要控制while循环,请检查
fopen
的结果,如果失败,它将返回
NULL
,您仍然尝试从中读取。您比我领先不到一秒…+1。@iharob,刚刚厌倦了被您打败:)非常感谢,现在我更了解此函数。您比我领先不到一秒…+1。@iharob,刚刚厌倦了被你打败:)非常感谢,现在我更了解这个函数了。