gpt4 book ai didi

c - 逐部分写入大型二进制文件

转载 作者:行者123 更新时间:2023-11-30 15:47:25 25 4
gpt4 key购买 nike

我正在尝试执行一项相当简单的任务,但对 FILE* 的工作原理感到困惑。所以我正在编写一个二进制文件(las 文件),它有一个标题,然后是二进制格式的点。由于这是一个很大的文件,所以我将一部分一部分地进行。但当文件指针正确写入文件的近 3/4,然后给出完全错误的文件位置指针时,问题就出现了。

//struct points written to 
struct las_points{
float x;
float y;
float z;
float time;
};
int writepoints(){
outfilename = "pointcloud_13.las";
fout = fopen(outfilename,"wb+");
// numPts - total number of points to be processed
// numRec - number of records processed every time
numRec = numPts/4;
las_points *lp;
// ending size of the file
int endSize = 0,j=0;
// header is written
// endSize = 233
for(i=0;i<numPts;i+=numRec){
lp = (las_points*)malloc(sizeof(las_points)*numRec);
// some processing done
printf("Iteration - %d\n",j);
lasWritePoints(lp,fout,numRec,endSize);
fflush(fout);
free(lp);
lp = NULL;
}
fclose(fout);
}
int lasWritePoints(las_points*lp, FILE* fout,int numRec,int &endSize){
if(!fout || !lp){
printf("File couldnt be written \n");
exit(1);
}
printf("endSize - %d \n",endSize);
fseek(fout,endSize,SEEK_SET);
for(int i=0;i<numRec;i++) {
fwrite(&lp[i].x,sizeof(float),1,fout);
fwrite(&lp[i].y,sizeof(float),1,fout);
fwrite(&lp[i].z,sizeof(float),1,fout);
fseek(fout,8,SEEK_CUR);
fwrite(&lp[i].time,sizeof(float),1,fout);
}
endSize = ftell(fout);
printf("endSize - %d \n",endSize);
}

仅再现二进制文件的写入。问题在于,对于文件的前四次迭代,它运行顺利。然后在最后一次迭代结束时,它给出的 endSize 小于开始的 endSize。

 Output:
Total size of file to be read: 1258456752
Iteration : 0
endSize : 233
endSize : 550575041
Iteration : 1
endSize : 550575041
endSize : 1101149849
Iteration : 2
endSize : 1101149849
endSize : 1651724657
Iteration : 3
endSize : 1651724657
endSize : 54815783

有人可以指出我做错了什么吗?

最佳答案

您写入的字节数超出了 32 位 int 所能表示的字节数(大约 20 亿 = 2 GB)。使用long来存储ftell()的结果:

long endSize = ftell(fout);
printf("endSize - %ld\n", endSize);

关于c - 逐部分写入大型二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17435432/

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