ifstream读取文件失败往往是由于路径中包含中文字符而造成的,因为默认的ifstream对象无法识别出中文,从而导致路径解析乱码,无法找到文件而失败。
原理介绍:每个ifstream对象内部都包含一个locale变量,用来指定字符的解析、比较等所有相关规则。默认构造的locale变量,是以“C”规则(可以把它简单地看成是只识别英文字符的规则)来初始化的。所以只要你只读取全英文路径的文件及全英文的内容,是不会有问题的。而当我们需要读取中文路径文件或中文内容时,就要更改locale变量的规则。
示例代码:
原理介绍:每个ifstream对象内部都包含一个locale变量,用来指定字符的解析、比较等所有相关规则。默认构造的locale变量,是以“C”规则(可以把它简单地看成是只识别英文字符的规则)来初始化的。所以只要你只读取全英文路径的文件及全英文的内容,是不会有问题的。而当我们需要读取中文路径文件或中文内容时,就要更改locale变量的规则。
示例代码:
01 | char buffer[50]; |
02 | ifstream ifs; |
03 |
04 | //输出默认locale规则的名字 |
05 | cout << ifs.getloc().name.c_str() << endl; |
06 | //更改locale规则以支持中文 |
07 | ifs.imbue(locale( "chs" )); |
08 | cout << ifs.getloc().name.c_str() << endl; |
09 | //打开中文路径文件 |
10 | ifs.open( "d:\\测试.txt" ); |
11 | if (ifs.good()) |
12 | { |
13 | //读取中文字符 |
14 | ifs.getline(buffer, 50); |
15 | } |
转自:http://my.oschina.net/chen0dgax/blog/91924