2016-08-12 74 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的答案。 –