【问题标题】:C popen fwrite buffer problemsC popen fwrite 缓冲区问题
【发布时间】:2012-09-12 12:30:00
【问题描述】:

我使用我的 C 程序将二进制数据流式传输到 ImageMagick:

inbuf = popen(string, "wb");
setbuf(inbuf, NULL);                  /// !!! ///
fwrite(buffer, frame, 1, inbuf);
pclose(inbuf);

而且 ImageMagick 并不总是在 windows (mingw) 上接收所有数据。如果没有 setbuf 命令(禁用缓冲),它接收的数据会更少,并且在 Linux (gcc) 上也会出现问题。

当我将相同的缓冲区转储到文件时,一切正常,所有数据都写入磁盘,我什至不必禁用缓冲:

outbuf = fopen("temp\\tune.gray", "wb");
fwrite(buffer, frame, 1, outbuf);
fclose(outbuf);

我发现当我发送奇数字节时会出现问题:) 当我发送偶数时一切正常。我尝试不以批量模式写入数据,而是将缓冲区拆分为更小的部分,甚至尝试逐字节发送数据 - 它没有帮助。有什么想法吗?

【问题讨论】:

    标签: c imagemagick mingw stdin popen


    【解决方案1】:

    fwrite 返回成功写入的字节总数。您可以编写一个循环来测试实际写入了多少字节,然后继续进行下一次写入操作(从成功写入的位置开始),直到成功写入整个缓冲区。

    【讨论】:

    • 也试过了。 fwrite 返回正确的数字,但 ImageMagick 没有获取数据。也许我应该深入研究它的来源?
    • 好的@DEgorov你是否正确使用了fwrite参数,即你上面的代码应该意味着“你只发送1个元素的框架大小的元素数组”。第二个参数是“发送的结构大小”,第三个元素是大小元素的数量cplusplus.com/reference/clibrary/cstdio/fwrite
    • 是的,一切都是正确的——缓冲区是指向我的数据的指针,帧是我需要发送的数据的大小,所以数字是 1。我尝试在不同的部分发送数据(甚至是 1 字节帧次) - 没有帮助。
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多