[英]Read file in binary and output in hex std::cin to std::cout
[英]Read binary data from std::cin
將二進制(非格式化)數據從std::cin
讀取到string
或stringstream
的最簡單方法是什么?
std::cin
不使用 ios_binary 打開。 如果必須使用 cin,則需要重新打開它,這不是標准的一部分。
這里有一些想法: https ://comp.unix.programmer.narkive.com/jeVj1j3I/how-can-i-reopen-std-cin-and-std-cout-in-binary-mode
一旦它是二進制的,您就可以使用cin.read()
來讀取字節。 如果您知道在您的系統中,文本和二進制之間沒有區別(並且您不需要可移植),那么您可以直接使用 read 而不必擔心。
對於 Windows,您可以將_setmode
函數與cin.read()
結合使用,如前所述。
_setmode(_fileno(stdin), _O_BINARY);
cin.read(...);
在此處查看解決方案來源:http: //talmai-oliveira.blogspot.com/2011/06/reading-binary-files-from-cin.html
在 Unix/POSIX 系統上,您可以使用cin.get()
方法逐字節讀取數據並將數據保存到std::vector<unsigned int>
之類的容器中,或者您可以使用cin.read()
以便將固定數量的字節讀入緩沖區。 您還可以使用cin.peek()
檢查任何數據流結束指示符。
請記住,避免對此類操作使用operator>>
重載...使用operator>>
將導致在觀察到分隔符時發生中斷,並且還會從流本身中刪除分隔符。 這將包括任何等效於空格、制表符等的二進制值。因此,您最終使用該方法從std::cin
存儲的二進制數據將與輸入二進制流逐字節匹配。
cin.read
將存儲固定數量的字節,無需任何邏輯搜索@Jason 提到的類型的分隔符。
但是,流上可能仍然存在活動轉換,例如 CRLF -> NL,因此它仍然不適合二進制數據。
所有預定義的 iostream 對象都必須綁定到相應的 C 流:
對象
cin
控制來自與對象stdin
關聯的流緩沖區的輸入,在<cstdio>
中聲明。
http://eel.is/c++draft/narrow.stream.objects
因此獲取二進制數據的方法與 C 相同:
基本上,你能做的最好的就是:
freopen(NULL, "rb", stdin);
這將重新打開標准輸入,使其成為相同的輸入流,但采用二進制模式。 在正常模式下,從 Windows 上的標准輸入讀取會將
\r\n
(Windows 換行符)轉換為單字符 ASCII 10。使用“rb”模式會禁用此轉換,以便您可以正確讀取二進制數據。
使用 windows/mingw/msys/bash,如果您需要在其間使用二進制流傳輸不同的命令,則需要將 std::cin 和 std::cout 作為二進制流進行操作。
Mikhail 的 _setmode 解決方案完美運行。
使用 MinGW,needed 標頭如下:
#include <io.h>
#include <fcntl.h>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.