读书人

VS2010诡异的文件输出流解决思路

发布时间: 2012-03-17 19:06:28 作者: rapoo

VS2010诡异的文件输出流
先看如下代码

C/C++ code
#include<iostream>#include<fstream>using namespace std;int main(){    ofstream fout("1.txt");    char a[100] = "木";    fout<<a<<endl;}

此代码在VS2010下调试出来的结果,文档中输出一个乱码,可是如果在最后一行代码上加上cout<<a<<endl;在命令行输出的是“木”,为什么在文档中就不会出现?
还有更奇怪的,如果把“木”改成“我”,就会在文档中正常输出,改成“小”,依然是乱码;
还有更奇怪的,如果在把最后一句改成fout<<"我"<<a<<endl;这样在文本中也会正常的输出“我木”!
哪位大神知道原因,请赐教!

[解决办法]
呵呵,微软的bug
以前听说过,你用记事本写个联通保存进去,然后打开就是乱码
眼见不为实
[解决办法]
应该是源代码的编码和控制台编码不一致导致的
楼主用setlocale设置下

另外,文件打开使用的编码格式也要和写入的内容格式一致


[解决办法]
你用写字板打开就是对的

不是unicode的问题。

而是记事本对宽字符支持的问题。
[解决办法]
探讨

引用:
你用写字板打开就是对的

不是unicode的问题。

而是记事本对宽字符支持的问题。


用写字板打开的确可以显示“木”,为什么在前面加个“我”,后面就可以输出“木”了呢?

[解决办法]
或者看看这篇文章:
http://en.cppreference.com/w/cpp/locale/codecvt_byname
[解决办法]
越描越黑啊。

给你2个注意的地方

1.设置Locale。
2.使用宽字符流。
3.检查你的console编码。
[解决办法]
探讨

引用:

引用:
你用写字板打开就是对的

不是unicode的问题。

而是记事本对宽字符支持的问题。


用写字板打开的确可以显示“木”,为什么在前面加个“我”,后面就可以输出“木”了呢?

你能用记事本看见“我”,估计是个巧合。我在英文版的Win7上试过,“我”与“木”都不可以输出。传统的……

[解决办法]
Ansi不可以保存中文。在中文Windows上,ansi(准确的说是mbcs)的默认编码是GB2312,所以你能保存中文。但到了英文Windows上,由于默认代码页是437(OEM - United States),打开文件就变乱码。这种依赖代码页的文件是不可靠的。最好用Unicode文件,在Windows下是有BOM的,能自动识别。

读书人网 >C++

热点推荐