为何std::ifstream与getc读取文件时换行符处理存在差异?
为什么C++读取文件会丢失
\r,而C风格二进制读取却能保留? 这个差异的核心原因其实是文件打开时的模式不同,咱们来理清楚:
C++的
std::ifstream默认用文本模式打开文件
你写的std::ifstream t(filename);没有指定打开模式,默认是文本模式(对应std::ios_base::in)。在Windows系统的文本模式下,系统会自动把文件里的\r\n(Windows标准换行)转换成单个的\n(C++标准换行),这个转换是在读取过程中悄悄完成的。所以不管你用istreambuf_iterator还是其他方式读取,拿到的都是转换后的内容,自然就看不到\r了。C风格的
fopen用"rb"指定了二进制模式
你的C版本代码里用了"rb"作为打开模式,这里的b就是binary(二进制)的意思。在二进制模式下,操作系统不会对文件内容做任何预处理,每一个字节都会原封不动地被读取,所以文件里的\r\n会完整地被存入字符串,content2自然就保留了原始的换行符组合。
如果想让C++的代码也能读取到原始的\r\n,只需要在打开文件时加上二进制模式就行:
std::ifstream t(filename, std::ios::binary);
这样修改后,两个函数返回的结果就完全一致了。
内容的提问来源于stack exchange,提问作者Blair Fonville
相关产品推荐
相关产品推荐

