正如已经在这个问题C - fwrite binary file bigger than 4GB中发布的,我需要写一个大于4 GB的二进制文件。正如从第一个答案中了解到的,我决定开发多次调用fwrite的代码。
我的采集板有2个bufferLength12 = bufferLenght34 = 524288字节大小的FIFO。每个FIFO存储器都与不同的通道连接,因此当我开始采集时,它们中的数据都来自不同的通道。
我想从这些FIFO中进行多次读取,比如4*nacq。我想为每个获取周期使用不同的指针。
所以我是这样分配内存的:
v12 = (UINT64 *) calloc ( bufferLength12 , 4*nacq);
v34 = (UINT64 *) calloc ( bufferLength34 , 4*nacq);然后开始采集,对于每个采集周期,我应该传递一个不同的指针,以便将数据存储在RAM中。
我用这种方式在指针上做了一个圆圈:
for ( p=v12,q=v34 ; p<v12+4*nacq && q<v34+4*nacq; p++,q++) {
ReadF(h, 0, (UINT64 *) p , bufferLength12 , NULL, 0);
ReadF(h, 1, (UINT64 *) q , bufferLength34 , NULL, 0); }然后,我尝试将RAM中的数据写入二进制文件:
for ( p=v12,q=v34 ; p<v12+4*nacq && q<v34+4*nacq; p++,q++) {
fwrite( (UINT64 *) p, 8 , bufferLength12 , fd12);
fwrite( (UINT64 *) q, 8 , bufferLength34 , fd34);
}
fclose(fd12);
fd12=NULL;
fclose(fd34);
fd34=NULL;如果我运行代码,我得到的二进制文件的大小远远大于实际的采集长度。所以我认为指针没有正确初始化。
如果我绘制采集的数据(只是噪声),我可以看到由于使用calloc进行的分配,我可以看到许多0值。

任何帮助都将不胜感激!
发布于 2013-09-18 17:59:44
有许多问题和指标……迷惑。
这一点:
对于FIFO #1,我为4*
UINT64指针分配了空间,每个指针的内存大小都是bufferLength12:
非常难以解释,而且肯定与代码不匹配:
v12 = (UINT64 *) calloc ( bufferLength12 , 4*nacq);
v34 = (UINT64 *) calloc ( bufferLength34 , 4*nacq);您正在分配两个内存块,一个是bufferLength12 * 4 * nacq字节,另一个是bufferLength34 * 4 * nacq字节。上面的代码中没有任何内容支持您的声明,即您正在为"4*nacq UINT64指针“分配空间,这根本不是真的。
此外,您还应该删除强制转换。
由于您将在这些缓冲区中运行一些数据采集,因此使用calloc()也完全没有意义,因为在将内存返回给您之前,它会花费时间清除内存。
假设您实际上指的是4* nacq * bufferLength12 64位值和4* nacq * bufferLength34 64位值,则分配应为:
UINT64 *v12 = malloc(4 * nacq * bufferLength12 * sizeof *v12);
UINT64 *v34 = malloc(4 * nacq * bufferLength34 * sizeof *v34);此外,不要关闭循环中的文件,这会使它在下一次写入时立即失败。
https://stackoverflow.com/questions/18868882
复制相似问题