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));
}