C++ 使用std::ifstream和getc读取换行符的差异
如果我使用以下命令读取文件:C++ 使用std::ifstream和getc读取换行符的差异,c++,C++,如果我使用以下命令读取文件: std::string readfile(const std::string &filename) { std::ifstream t(filename); std::string str; str.assign(std::istreambuf_iterator<char>(t), std::istreambuf_iterator<char>()); return str;
std::string readfile(const std::string &filename)
{
std::ifstream t(filename);
std::string str;
str.assign(std::istreambuf_iterator<char>(t),
std::istreambuf_iterator<char>());
return str;
}
尝试两种方法:
int main(int argc, char **argv)
{
const std::string filename = "work\\actionlabel.html";
std::string content1(readfile(filename));
std::string content2(readfile_c(filename));
}
给我这个:
如图所示,content1
(来自readfile)只有\n新行,而content2
(来自readfile\u c)有文件的实际新行\r\n
为什么会有差异?流默认为文本模式,其中文件内容可能与流看到的内容不匹配。例如,在Windows中,磁盘文件包含“代码> > r\n>代码>行结束,但是C++文本流只会看到行结束的<>代码> \n/CODE >。此功能有助于编写必须处理不同操作系统约定的可移植代码
在二进制模式下,文件内容与流看到的内容完全匹配
在代码fopen中(filename.c_str(),“rb”)
指定了二进制模式,但在ifstream
中没有指定;给你文本模式
要在这两种情况下获得相同的行为,您可以对
fopen
使用“r”
,在这两种情况下都提供文本模式,或者使用std::ios::binary
作为ifstream
的第二个参数,在这两种情况下都给出二进制模式。请不要把C++问题标记为C@ @ TADMAN。我的问题是关于C++函数和C函数的比较。所以这两个标签似乎都与我有关。将std::ios::binary
添加到@O'Neil好吧,这很容易。谢谢
int main(int argc, char **argv)
{
const std::string filename = "work\\actionlabel.html";
std::string content1(readfile(filename));
std::string content2(readfile_c(filename));
}