【问题标题】:How to read data from binary file in dynamic array in C如何从C中动态数组中的二进制文件中读取数据
【发布时间】:2012-12-28 08:10:04
【问题描述】:

在以下代码中,我尝试从二进制文件中读取数据并将其写入动态数组。
函数“getAnz”应该给我数据集的数量。
在函数“readRecs”中,我想从二进制文件中读取数据并将其写入动态数组(zArr)。
该程序为我提供了正确数量的数据集。是的。

现在我有几个问题:
1、我读取数据写入动态数组的方式有什么问题?
2. 如何将“zArr”从 main 函数传递给 readRecs 函数?
3. 还有其他更简单的方法来获取文件中的数据集数量吗?
感谢您的帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct daten
{
    char name[20];
    int alter;
};

long getAnz(FILE *fp)
{
    struct daten ptr;
    long counter = 0;

    while(fread(&ptr, sizeof(struct daten), 1, fp))
    {
        counter++;
    }

    fclose(fp);

    return counter;
}

void foo(FILE *fp, struct daten *zArr[], long lAnz)
{
    long i = 0;

    for(i = 0;i < lAnz;i++)
    {
        if(i == 0)
        {
             zArr = malloc(sizeof(*zArr));
        }
        else
        {
            zArr = realloc(zArr,sizeof(*zArr)*(i+1));
        }   
    }

    fclose(fp);
}

int main(void)
{
    struct daten *zArr;
    long anz = 0, i = 0;

    FILE *fp = fopen("daten.bin", "rb");
    anz = getAnz(fp);
    printf("%ld\n", anz);
    foo(fp, &zArr, anz);

    for(i = 0; i<anz; i++)
    {
        printf("%s\t", zArr[i].name);
        printf("%d\n", zArr[i].alter);
    }

    return 0;
}

【问题讨论】:

    标签: c arrays dynamic data-structures binaryfiles


    【解决方案1】:

    在其他问题中,您将指针zArr 传递给void foo(FILE *fp, struct daten *zArr[], long lAnz),因此它的更改范围在函数内。如果您希望更改在 foo 返回后仍然存在,请尝试 void foo(FILE *fp, struct daten * &amp;zArr, long lAnz)

    【讨论】:

      【解决方案2】:

      Here我是这样动态读取的:

      ssize_t mygetline(char **buffer, int fd){
              size_t bufportion = 16000, bufsz = bufportion, i = 0;
              free(*buffer); *buffer = NULL;
              char *ptr;
              char *buf;
              buf = malloc(bufsz);
              if(!buf){freeQS(); die(MEMERR);}
              ptr = buf;
              if(read(fd, ptr, 1) != 1){ free(buf); return -1; }
              do{
                      if(*ptr == '\n' || *ptr == 0) break;
                      ptr++;
                      if(++i >= bufsz){
                              bufsz += bufportion;
                              buf = realloc(buf, bufsz);
                              if(!buf){freeQS(); die(MEMERR);}
                              ptr = &buf[i];
                      }
              }while(read(fd, ptr, 1) == 1);
              *ptr = 0;
              if(ptr > buf && *(ptr-1) == '\r') *(ptr-1) = 0;
              *buffer = strdup(buf);
              free(buf);
              return strlen(*buffer);
      }
      

      在您上面的代码中,没有用数据填充数组的操作。

      【讨论】:

      • 对不起,但这对我没有帮助。你能具体解释一下我的代码有什么问题以及我需要纠正什么吗?
      • 我举个例子。首先,您可以同时用数据填充数组并计算数据长度。其次,如果我们回到您的代码,int getAnz 不需要读取一部分数据,您可以读取更多(当然输入缓冲区应该更大)。函数foo 做了一些奇怪的事情:如果你知道数据大小,你为什么要调用realloc 这么多次?而这个函数并没有做它的主要工作:填充数据数组。顺便说一句,您关闭文件 两次
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      相关资源
      最近更新 更多