繁体   English   中英

使用std :: ifstream和getc读取换行符的差异

[英]Difference in reading newlines using std::ifstream and getc

如果我使用此文件读入:

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

我发现返回的字符串中的换行符与文件的实际内容不同。 该文件使用\\r\\n ,而返回的字符串仅包含\\n

我通过使用旧的c样式函数确认了这一点:

std::string readfile_c(const std::string &filename)
{
    FILE *f = fopen(filename.c_str(), "rb");
    std::string str;
    char c;
    while ((c = getc(f)) != EOF)
        str.push_back(c);
    fclose(f);
    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_c )只有文件的实际换行符\\ r \\ n

为什么有区别?

流默认为文本模式,在该模式下 ,文件内容可能与流看到的内容不匹配。 例如,在Windows中,磁盘文件包含\\r\\n行尾,但是C ++文本流将仅看到\\n作为行尾。 此功能有助于编写必须处理不同OS约定的可移植代码。

二进制模式下 ,文件内容应与流中看到的内容完全匹配。

在代码fopen(filename.c_str(), "rb"); 您指定了二进制模式,但是在ifstream中没有指定; 给你文本模式。

为了在两种情况下都具有相同的行为,您可以在fopen使用"r" ,在两种情况下均使用文本模式,或者在std::ios::binary作为ifstream第二个参数,在两种情况下均采用二进制模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM