2016-08-12 58 views
0

我在C++中編寫了一個二進制文件,下面的代碼。它輸出文件,但是當我打開它。我看到它是一種ASCII格式。我究竟做錯了什麼 ?如何將字符串消息保存爲二進制文件?寫入二進制C++錯誤

#include <iostream> 
#include <fstream> 
#include <stdlib.h> 
#include <string> 

using std::ios; 

void writeFile(const std::string &fileName, const std::string data) 
{ 
    std::ofstream ofs; 
    ofs.open(fileName.c_str(), ios::out | ios::binary); 
    if (ofs.is_open()) 
    { 
     ofs.write(data.c_str(),data.size()); 
     ofs.close(); 
    } 
    else 
    { 
     std::cerr <<"Error while writing File: "<<fileName<<std::endl; 
     exit (EXIT_FAILURE); 
    } 
} 

int main(int argc, char const *argv[]) 
{ 
    /* code */ 
    std::string message = "This should be binary"; 
    writeFile("sample", message);  


    return 0; 
} 

回答

1

如果您的字符串是ASCII文本,並且您在二進制模式下打開,則文件將被填充ASCII文本; ASCII在字符和字節之間具有1-1對應關係,所以用ASCII解釋內容的文本編輯器將其看作文本。

二元模式通常只對Windows有用,它禁用行結束轉換。在文本模式的Windows中,字符串中的\n在輸出上無縫地轉換爲\r\n,在輸入上從\r\n轉換爲\n以匹配Windows約定。二進制模式會禁用該轉換,但不會改變任何內容。

如果要確認這一點在Windows上,像"Foo\nBar"一個字符串寫入到二進制模式下的文件,然後用notepad.exe打開它(這是一個「啞巴」編輯器,只爲行結束對\r\n堅持)。它將在一行中顯示兩個單詞;如果您以文本模式將相同的字符串寫入文件,則它們會出現在不同的行上。

+0

你知道如何將ascii字符串寫成二進制文件嗎?那麼它是否也需要在閱讀時重新轉換爲字符串? – itsnevertoobadtoaskforhelp

+1

@itsnevertoobadtoaskforhelp:你已經做到了。字符串的字面字節存儲在文件中。關鍵是字面字節是ASCII文本,所以它看起來像文本。重讀ShadowRanger的答案。 –