写入二进制C++错误
问题描述:
我在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;
}
答
如果您的字符串是ASCII文本,并且您在二进制模式下打开,则文件将被填充ASCII文本; ASCII在字符和字节之间具有1-1对应关系,所以用ASCII解释内容的文本编辑器将其看作文本。
二元模式通常只对Windows有用,它禁用行结束转换。在文本模式的Windows中,字符串中的\n
在输出上无缝地转换为\r\n
,在输入上从\r\n
转换为\n
以匹配Windows约定。二进制模式会禁用该转换,但不会改变任何内容。
如果要确认这一点在Windows上,像"Foo\nBar"
一个字符串写入到二进制模式下的文件,然后用notepad.exe
打开它(这是一个“哑巴”编辑器,只为行结束对\r\n
坚持)。它将在一行中显示两个单词;如果您以文本模式将相同的字符串写入文件,则它们会出现在不同的行上。
你知道如何将ascii字符串写成二进制文件吗?那么它是否也需要在阅读时重新转换为字符串? – itsnevertoobadtoaskforhelp
@itsnevertoobadtoaskforhelp:你已经做到了。字符串的字面字节存储在文件中。关键是字面字节是ASCII文本,所以它看起来像文本。重读ShadowRanger的答案。 –