【问题标题】:Read binary data from stdin on Win32, and write it to file在 Win32 上从标准输入读取二进制数据,并将其写入文件
【发布时间】:2014-01-28 16:47:44
【问题描述】:

什么是相当于 Unix 管道的 Windows (Win32) 命令行:

myprog myarg | cat >out.dat

请注意,我想要一个管道,以测试myprog可以成功写入管道,所以请不要将其简化为:

myprog myarg >out.dat

我猜是这样的

myprog myarg | copy /b con out.dat

可以,但我没有要检查的 Windows 机器。

请注意,生成的数据是二进制的,它包含所有可能的字节值 0 .. 255,并且所有这些值都必须保持原样,无需任何转换。

【问题讨论】:

  • 我认为将重定向输出写入管道和文件在技术上没有任何区别。
  • @Mark Ransom:不过,我想写信给管道,只是为了 100% 确保它正常工作。
  • 这就是我想告诉你的——如果它正确地写入文件 100%,它也会正确地写入管道 100%。没有办法可以工作,但另一个不行,因为 Windows 本身会处理细节。您的程序没有发现任何差异。
  • 我知道你认为它是这样工作的,但我也想自己尝试一下,因为管道发生了一些奇怪的事情,我想调试它。
  • @Mark:可能存在差异,具体取决于代码的作用。例如,尝试重新定位句柄将在文件上工作,但在管道上失败(或者,我怀疑,被默默地忽略)。可能还有更微妙的情况。

标签: windows console pipe


【解决方案1】:

由于 Windows 没有这样的程序,这里有一个 C 语言的快速程序。

#include <stdio.h>
#include <io.h>
#include <fcntl.h>

int main()
{
    char buffer[16384];
    int count;
    _setmode(_fileno(stdin), _O_BINARY);
    _setmode(_fileno(stdout), _O_BINARY);
    while ((count = fread(buffer, 1, sizeof(buffer), stdin)) != 0)
        fwrite(buffer, 1, count, stdout);
    return 0;
}

您可以轻松修改它以写入您选择的文件而不是stdout

【讨论】:

    【解决方案2】:

    在给定的示例中,Windows 中没有任何内置功能与您使用 cat 的方式相同。你建议的命令(copy /b con)肯定不行,因为con是控制台设备,不是标准输入。

    您可以尝试GNU utilities for Win32,其中包括cat 的端口。否则您可能需要编写自己的代码,这当然很简单。

    【讨论】:

    • 附录:findstr . 在许多情况下都可以使用。您需要注意它会抑制空白行,并且不能很好地处理 Unicode。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2021-07-02
    • 2013-03-22
    • 2015-05-06
    相关资源
    最近更新 更多