如何用C++的ifstream读取包含换行符的文件字符串?
解决getline读取时丢失换行符的问题
嘿,这个问题我之前处理过!其实getline()本身的设计就是会自动丢弃换行符的——它把换行符(默认的行分隔符)当作行结束的标志,读完一行后不会把\n存入到你的string line变量里。要保留换行符,得手动处理,这里给你几个靠谱的方案:
方案1:读完行后手动补换行符
这是最直接的办法,每次用getline()读完一行,就给line加上\n。不过要注意最后一行的情况:如果文件最后一行没有换行符,硬加就会多出来,所以可以加个判断:
ifstream fs8(sourceFile); string line; // 先读第一行,避免空文件的情况 if (getline(fs8, line)) { do { // 检查读完当前行后,流是否还没到末尾(不是最后一行) if (!fs8.eof()) { line += '\n'; } // 这里执行你的UTF-8转UTF-16逻辑 // ... } while (getline(fs8, line)); }
方案2:先读整个文件再处理(更稳妥)
如果你的核心需求是保留所有原始换行符(包括Windows下的\r\n),不如直接把整个文件读进内存,再处理。这样能完美保留所有换行符,还能避免逐行处理的小坑:
#include <sstream> // 用二进制模式打开,防止系统自动转换换行符(比如把\r\n转成\n) ifstream fs8(sourceFile, ios::binary); stringstream buffer; buffer << fs8.rdbuf(); string fullContent = buffer.str(); // 现在fullContent里包含了文件所有原始内容,包括所有换行符 // 你可以直接对整个字符串做UTF-8转UTF-16,或者按自己的方式拆分处理
方案3:自定义getline分隔符(不推荐,仅特殊场景用)
如果你非要坚持逐行读的方式,也可以修改getline的分隔符,但这种方式需要自己处理不同系统的换行格式(比如\r\n),比较麻烦,举个例子仅供参考:
ifstream fs8(sourceFile); string line; // 用一个几乎不会出现在文本里的字符当分隔符,比如空字符char(0) // 这样会把整个文件当成一行读进来,其实和方案2效果差不多,但不如方案2直观 while (getline(fs8, line, char(0))) { // 这里line包含所有内容,包括换行符,但这种方式实用性不高 }
最后补个小提示:如果你的文件是Windows格式(换行是\r\n),默认文本模式下ifstream会自动把\r\n转换成\n,要是想保留原始的\r,一定要用二进制模式打开文件(就是方案2里的ios::binary参数)。
内容的提问来源于stack exchange,提问作者VFbvb
相关产品推荐
相关产品推荐

