0

正如已经在这个问题中发布的C - fwrite 二进制文件大于 4GB我需要编写一个大于 4GB 的二进制文件。从第一个答案中了解到,我决定开发我的代码,多次调用fwrite.

bufferLength12 = bufferLenght34 = 524288我的采集板有 2 个字节大小的 FIFO 。每个 FIFO 存储器都与不同的通道链接,因此当我开始采集时,它们中的数据都来自不同的通道。

我想4*nacq从这些 FIFO 中进行多次读取。我想为每个采集周期使用不同的指针。

所以我以这种方式分配了内存:

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;

如果我运行代码,我会得到一个比实际采集长度大得多的二进制文件大小。所以我认为指针没有被正确初始化。

如果我绘制获取的数据(只是噪声),我可以看到很多 0 值,因为使用calloc.

在此处输入图像描述

任何帮助将不胜感激!

4

1 回答 1

0

有很多问题和迹象表明......混乱。

这个:

对于 FIFO #1,我为 4*nacq 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 * bufferLength1264 位值和 4 * nacq * bufferLength3464 位值,分配应该是:

UINT64 *v12 = malloc(4 * nacq * bufferLength12 * sizeof *v12);
UINT64 *v34 = malloc(4 * nacq * bufferLength34 * sizeof *v34);

另外,不要关闭循环的文件,这将使它在下一次写入时立即失败。

于 2013-09-18T09:59:44.053 回答