将数据从文件写入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,刚刚厌倦了被你打败:)非常感谢,现在我更了解这个函数了。