要说使用C++逐行读取文本文件(通常为.txt文件),最为常见的写法是这样的:
std::string strLine;
while(getline(file,strLine))
{
……
}
这里忽略了一个重要的因素——文本的编码方式。
打开windows自带的记事本程序,留意观察“保存”对话框,其右下角提供了文字编码选择下拉列表,除了大家熟知的ANSI和UNICODE编码,还有可以说最为常用的UTF-8编码。
很显然,如果读取的文本文件并非ANSI编码,那么上述代码恐怕就无法如你所愿了。
因此,应当首先对文本编码进行判断,然后采取不同的处理办法,这才是稳妥的解决思路。
根据文本文件的头两个字节,我们可以做如下的判断:
- 0xBBEF:UTF-8
- 0xFEFF:UNICODE
- 0xFFFE:UNICODE Big-Endian
- 如果都不是,那么ANSI
接下来,我们可以使用ifstream的getline来逐行读取了,原因很简单,可以指定行结束标识,对于UNICODE编码来说,是0x000A
回到开始的代码,为了保持代码结构不变,可以用自定义的getline(比如叫GetLine)来替换string::getline。