簡體   English   中英

fstream std::ios::ASCII 二進制打印? 它工作正常嗎?

[英]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 插入器和提取器始終以文本傳輸,而不是二進制傳輸。 要以二進制形式寫入和讀取值,您必須使用名為(奇怪的是) writeread的成員函數:

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.

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