![](/img/trans.png)
[英]std::fstream::write && std::fstream::putc std::ios::binary
[英]fstream std::ios::binary printing in ASCII ? is it working correctly?
我試圖將一些數據寫入二進制文件,以下是該問題的最小可重現示例,我試圖將兩個無符號 64 位整數打印到二進制文件並再次讀取其中一個...問題是數據不會以二進制形式打印或讀取。
#inclue <fstream>
#include <iostream>
#include <stdint.h>
#include <iomanip>
int main()
{
uint64_t a = 1;
uint64_t b = 2;
uint64_t c;
std::ofstream s("file.bin", std::ios::out | std::ios::binary);
s << a << b;
s.close();
std::ifstream in("file.bin", std::ios::in | std::ios::binary);
in >> c;
in.close();
std::cout << c << '\n';
std::cin >> c;
return 0;
}
上面代碼的輸出是12
,所以我使用記事本檢查了文件,它有 12 用 ASCII 寫在其中,而不是二進制,我在 windows 上使用最新版本的 msvc2017,我嘗試為 x86 和 x6 編譯它,在調試和發布模式下,錯誤仍然存在。
這是它的預期行為嗎? 打印和閱讀時是否需要將每個變量轉換為字符數組?
stream 輸入和 output 運算符>>
和<<
是基於文本的。 他們會將 output 寫入文本,並將輸入讀取為文本。 即使是二進制文件。
要寫入原始二進制數據,請使用write
function。 要讀取原始二進制數據,請使用read
:
s.write(reinterpret_cast<char const*>(&a), sizeof a);
s.write(reinterpret_cast<char const*>(&b), sizeof b);
// ...
in.read(reinterpret_cast<char*>(&c), sizeof c);
如果您仔細觀察,並且您正在運行 Windows,您可能會看到std::ios::binary
的實際作用。 它告訴 stream 函數不要進行文本轉換。 特別是,在 Windows 系統上的文本模式下, '\n'
被寫為兩個字節, 0x0D
后跟0x0A
(或者可能相反),並且在輸入時,兩個字節序列被轉換為單個字符'\n'
。 在二進制模式下,只有一個字符。
Stream 插入器和提取器始終以文本傳輸,而不是二進制傳輸。 要以二進制形式寫入和讀取值,您必須使用名為(奇怪的是) write
和read
的成員函數:
s.write((const char*)&a, sizeof(a));
s.write((const char*)&b, sizeof(b));
in.read((char*)&c, sizeof(c));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.