【问题标题】:Most efficient way to split an array to write to different files拆分数组以写入不同文件的最有效方法
【发布时间】:2023-02-21 20:47:33
【问题描述】:

我正在从具有 2 个通道的 DAQ 中读取 double 数据。数据存储在read_buf中,第一个1000样本是channel 0,第二个1000channel 1。我无法控制通道数据的这种串联。

我已经像这样设置了2个文件,

FILE *fptr_0;
if ((fptr_0 = fopen("channel_0.bin", "wb")) == NULL)
{
    printf("Error opening file.\n");
    exit(1);
}

FILE *fptr_1;
if ((fptr_1 = fopen("channel_1.bin", "wb")) == NULL)
{
    printf("Error opening file.\n");
    exit(1);
}

然后我想拆分read_buf并将前半部分发送到fptr_0,将第二部分发送到fptr_1。我可以读出前半部分,但对如何读出后半部分感到困惑。我如何将fptr_1指向read_buf的后半部分?

我是否必须将每一半复制到一个新数组中?

到目前为止,我所拥有的对上半年有效,然后是我没有得到的,

result = DAQ_func(device, &status, read_buf);
fwrite(&read_buf, sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_0);
fwrite( ??? , sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_1);

【问题讨论】:

  • 添加read_buf的定义。是double read_buf[2000];吗?
  • 旁白:先找到一个能正常工作的解决方案怎么样?然后你可以担心效率。

标签: arrays c fwrite


【解决方案1】:

???read_buf + 1000(没有 &)。

fwrite(read_buf + 1000, sizeof (double), (sizeof read_buf / sizeof read_buf[0]) / 2, fptr_1);

或者,如果您更喜欢 &read_buf[1000],那也是一样的。

【讨论】:

    【解决方案2】:
    fwrite( ??? , sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_1);
    

    read_buf 加 1000 会在基地址上加 1000 *sizeof (double)

    read_buf + (1000 * sizeof (double));
    

    所以这给了我们:

    fwrite (read_buf + 1000, sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_1);
    

    这是最有效的方法吗?也许不是,但这是正确的。

    fwrite() 的返回值也应该被检查:

    fwrite() 函数应返回元素的数量 成功写入,如果写入可能少于nitems 遇到错误。如果 size 或 nitems 为 0,fwrite() 应 返回 0 并且流的状态保持不变。 否则,如果发生写入错误,则错误指示器 stream 应被设置,errno 应被设置以指示 错误。

    注意:以上答案假定read_bufdouble 的数组[2000]。

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多