我有这种结构:
typedef struct {
char a[MAX];
char b[MAX];
int c;
} mys;
这个功能:
mys* search_m(FILE *fp, int m)
{
mys* s;
s=(mys *)malloc(sizeof(mys));
if(s){
for(int i=0;i<m;i++)
fread(s,sizeof(mys),1,fp);
}else{
printf("Error during allocation\n");
}
return s;
}
void search_s(FILE *fp, char *c)
{
mys s;
int count=0;
while(fread(&s,sizeof(mys),1,fp)==1){
if(strcmp(s.b,c)==0){
show_s(s,count);
}
count++;
}
return;
}
这是我程序的一部分。在输入过程中(当我在文件上写入数据时)我没有任何问题(使用 fread),但读取它时遇到一些问题。
我的函数search_s每次调用它时都会执行并找到值,但是search_m函数似乎无法读取我文件中的anby数据,因为这实际上与我在 search_s 上所做的事情相同,我不知道我的错误在哪里。
在我的 main 中,当我调用 seach_m 时,我会这样做:
s=*search_ID(f_ptr,m);
show_s(s,m);
我认为问题不是主要的,因为 search_m 函数中的 fread 不会加载任何数据(它会在第一次尝试时停止)。
我的错误在哪里?我以为没关系 PS 在调用此函数之前,我打开文件并检查错误,然后关闭文件。
编辑: 我用这个打开文件:
f_ptr=fopen(argv[1],"rb");
(如果我只使用“r”,它也不起作用) argv[1] 是我的文件名
PS m 是我要读取的文件中元素的编号。 (我每次都会读一个 block ,直到我没有得到 m-esimo 元素)
我的文件仅包含该类型的结构。
最佳答案
The following line does not allocate enough memory.
s=(mys *)malloc(sizeof(mys));
您正在为对象分配内存。因此,您访问的内存多于分配的内存,这会导致未定义的行为。
您需要为 m
个对象分配内存。
s = malloc(sizeof(mys)*m);
参见Do I cast the result of malloc?了解为什么不应转换 malloc
的返回值。
此外,请确保读入已分配内存的适当插槽。
mys* search_m(FILE *fp, int m)
{
mys* s = malloc(sizeof(mys)*m);
if(s){
for(int i=0;i<m;i++)
fread(s+i, sizeof(mys), 1, fp); // Use s+i
}else{
printf("Error during allocation\n");
}
return s;
}
您可以将其压缩为一次对 fread
的调用。
mys* search_m(FILE *fp, int m)
{
mys* s = malloc(sizeof(mys)*m);
if(s){
fread(s, sizeof(mys), m, fp);
}else{
printf("Error during allocation\n");
}
return s;
}
关于c - 如何正确从文件中读取结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49243451/