如何在C语言中从动态数组中的二进制文件中读取数据
在下面的代码中,我尝试从二进制文件读取数据并将其写入动态数组。如何在C语言中从动态数组中的二进制文件中读取数据,c,arrays,dynamic,data-structures,binaryfiles,C,Arrays,Dynamic,Data Structures,Binaryfiles,在下面的代码中,我尝试从二进制文件读取数据并将其写入动态数组。 函数“getAnz”应该给出数据集的数量。 在函数“readRecs”中,我想从二进制文件中读取数据并将其写入动态数组(zArr)。 该程序为我提供了正确数量的数据集。嗯 现在我有几个问题: 1.我读取数据并将其写入动态数组的方式有什么问题? 2.如何将“zArr”从主函数传递到readRecs函数? 3.是否有其他更简单的方法来获取文件中的数据集数量? 谢谢你的帮助 #include <stdio.h>
函数“getAnz”应该给出数据集的数量。
在函数“readRecs”中,我想从二进制文件中读取数据并将其写入动态数组(zArr)。
该程序为我提供了正确数量的数据集。嗯 现在我有几个问题:
1.我读取数据并将其写入动态数组的方式有什么问题?
2.如何将“zArr”从主函数传递到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;
}
#包括
#包括
#包括
结构日期
{
字符名[20];
int alter;
};
long getAnz(文件*fp)
{
结构日期ptr;
长计数器=0;
while(fread(&ptr,sizeof(struct daten),1,fp))
{
计数器++;
}
fclose(fp);
返回计数器;
}
void foo(文件*fp,结构日期*zArr[],长lAnz)
{
长i=0;
对于(i=0;i 对于(i=0;i以及其他问题,您将通过值将指针zArr
传递到void foo(FILE*fp,struct daten*zArr[],long lAnz)
以便其更改在函数内进行。如果希望在foo返回后保持更改,请尝试void foo(FILE*fp,struct daten*&zArr,long lAnz)
我是这样读的:
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);
}
在上面的代码中,没有用数据填充数组的操作。对不起,这对我没有帮助。你能具体解释一下我的代码中有什么错误以及我需要纠正什么吗?我给你一个例子。首先,你可以同时用数据填充数组并计算数据长度。其次,如果我们返回到你的代码,intgetAnz
不需要按一部分读取数据,您可以读取更多数据(当然输入缓冲区应该更大)。函数foo
做一些奇怪的事情:如果您知道数据大小,为什么要调用realloc
这么多次?而且该函数不做其主要工作:填充数据数组。顺便说一句,您关闭了文件两次。