gpt4 book ai didi

c - 如何正确从文件中读取结构?

转载 作者:行者123 更新时间:2023-11-30 16:34:40 24 4
gpt4 key购买 nike

我有这种结构:

  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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com