簡體   English   中英

從 std::cin 讀取二進制數據

[英]Read binary data from std::cin

將二進制(非格式化)數據從std::cin讀取到stringstringstream的最簡單方法是什么?

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”模式會禁用此轉換,以便您可以正確讀取二進制數據。

https://stackoverflow.com/a/1599093/6049796

使用 windows/mingw/msys/bash,如果您需要在其間使用二進制流傳輸不同的命令,則需要將 std::cin 和 std::cout 作為二進制流進行操作。

Mikhail 的 _setmode 解決方案完美運行。

使用 MinGW,needed 標頭如下:

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

cplusplus.com

  • 無格式輸入

    istream 類的大多數其他成員函數用於執行未格式化的輸入,即不對從輸入中獲得的字符進行解釋。 這些成員函數可以從輸入字符序列( getgetlinepeekreadreadsome )中獲取確定數量的字符...

正如 Lou Franco 指出的那樣,std::cin 不是用 std::ios_base::binary 打開的,但是其中一個函數可能會讓您接近您正在尋找的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM