我有一个数组(POINTS),其长度大于&n; 20M以下结构(点),并希望将其保存在二进制文件中,然后在另一个程序中读取它:
typedef struct {
char *name;
unsigned char namelength;
} point;
if((POINTS = (point *) malloc (N * sizeof(point))) == NULL){
printf("when allocating memory for the points vector\n");
exit(0);
}
我正在做的是以下内容;首先,我创建一个变量namestot
,以了解我总共拥有多少个字符(某些名称可能为空):
for (i = 0; i < N; i++) namestot += POINTS[i].namelength;
然后我将数组写入文件中:
if ((fin = fopen(name, "wb")) == NULL){
printf("the output binary data file cannot be open\n");
exit(0);
}
for ( i=0; i < N; i++){
if (POINTS[i].namelength){
if( fwrite(point[i].name, sizeof(char), POINTS[i].namelength, fin) != POINTS[i].namelength){
printf("when writing names to the output binary data file\n");
exit(0);
}
}
}
有了这个我创建文件没有问题。现在我们更改为保存二进制文件的另一个程序,因此我们打开并阅读它:
if ((fin = fopen (argv[1], "r")) == NULL){
printf("the data file does not exist or cannot be opened\n");
exit(0);
}
//Here we allocate memory again for the POINTS vector
if((POINTS = (point *) malloc (N * sizeof(point))) == NULL){
printf("when allocating memory for the points vector\n");
exit(0);
}
if((allnames = (char *) malloc (namestot * sizeof(char))) == NULL){
printf("when allocating memory for the names vector");
exit(0);
}
if (fread(allnames, sizeof(char), namestot, fin) != namestot){
printf("when reading names from the binary data file\n");
exit(0);
}
//Setting pointers to names
for (i = 0; i < N; i++){
if(POINTS[i].namelength > 0){
POINTS[i].name = allnames;
allnames += POINTS[i].namelength;
}
}
但是,当我尝试读取第一个非空名称时,程序会打印整个名称数组,有关如何设置指向mesan的指针以获得POINTS数组的任何建议,就像我在第一个程序中一样吗?
谢谢!
PS:如果有任何未声明的变量,我可能忘记将其粘贴在此处,那不是问题。
答案 0 :(得分:1)
您正在为文件编写可变长度字符串,因此当您阅读它时,您需要知道单个字符串的长度
您可以决定在文件中包含长度字符串以及要写入的字符串,或者确保写入尾随'\ 0'表示先前的字符串结尾,新的字符串从下一个字节开始,您的读者程序必须解析字符串accordngly
答案 1 :(得分:0)
prints
整个名单
听起来好像是因为您没有告诉您的程序每个名称的结尾,请在遇到char *
时停止打印\0
。