【发布时间】:2018-02-24 06:53:01
【问题描述】:
这通常通过管道完成。管道 似乎 在我一直在 Windows 10 中测试(并完成大量工作!)的环境中工作正常,特别是:
- Git 重击
- MSYS2 bash
我发现如果我有一个大文件或二进制流,我可以准确地使用一些已安装的工具 (cat largefile.JPG | wc -c),但是每当我用 C++ 编写自己的图像处理程序时,无论我用什么方法来阅读标准输入(无论是使用 cstdio 老式 C 方法、使用 C 程序还是使用 C++ cin iostreams)我只得到一小部分流在结束之前出现。它的长度似乎是确定性的,所以同一个文件会产生相同的结果。
在 OS X 或 Linux 上测试相同的代码显然可以正常运行,其中标准输入流的长度是正确的长度。因此,这在这些平台上成为一种实用的方法,可以在不影响磁盘的情况下传递数据。十年来我一直在磨练我的 bash-fu,所以它很自然。
当然,必须存在其他我可以利用的方法,但我无法真正快速想出我可以依赖的东西。我可以在这里尝试解决哪些问题?我真的很喜欢我可以在 MSYS2 中使用 pacman 安装的一组 unix 工具,包括
g++.exe (Rev2, Built by MSYS2 project) 7.1.0
Copyright (C) 2017 Free Software Foundation, Inc.
但到目前为止,这是我的一大绊脚石。我用这个编译器编译的最简单的程序无法从标准输入流中获取大量有用的数据。这是为什么?如果是操作系统或 posix 层以及所有这些黑魔法的限制,那么为什么 wc 可以完美运行?
【问题讨论】:
-
请展示你最简单、可编译、可运行但无法读取所有
stdin的程序,以及你是如何运行它的。 -
我使用了this 代码,并像这样运行它:
cat large.JPG | ./size。它是用gcc size.c -o size编译的。 -
您需要以二进制模式读取流。在 Windows 中,字节值 26 (Ctrl Z) 表示文本模式的 EOF,至少如果它单独出现在一行上。也就是说,内存映射文件似乎比复制大量数据更有效。
-
基于 Cheers 的评论,这里有一些关于将 std::cin 作为二进制打开的想法:stackoverflow.com/questions/7587595/…
-
_setmode(_fileno(stdin), _O_BINARY);似乎是诀窍。
标签: c++ windows shell stream pipe