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

标签 c file

我有这种结构:

  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/

相关文章:

c# - 逐行读取一个大文本文件并搜索一个字符串

C++ 在文本文件中搜索跨多行拆分的字符串

java - 当我尝试反序列化对象时出错

c - 空指针中的字节数

c - 在 C 中生成有效的数独谜题

c - C 中的动态数组

linux - 删除不存在的文件

c - 预处理器的 If 条件问题

C(文件处理)

c - 在C中传输文件