我用VS6的控制台写了一个这样的小程序:#include <iostream>
#include <fstream>
using namespace std;int main()
{
ofstream ofile;
wchar_t str[100];
swprintf(str,L"世界,你好");
cout<<str<<endl;
printf("%s\n",str);
ofile.open("out.txt");
ofile<<str<<endl;
ofile.close();
ofile.clear();
return 0;
}但是输入的结果却是:
0012FE20
NLu `O}Y
Press any key to continue在文件中的输出是:
0012FE20为什么会是这些东西?第一个是内存地址吗?第二个又是什么?
最重要的问题是:怎样才能输出wchar_t到文件?(要字符串内容)还有,怎样在控制台上显示wchar_t? 谢谢!

解决方案 »

  1.   

    #include <iostream>
    #include <fstream>
    using namespace std;void main()
    {
    ofstream ofile;
    wchar_t str[100];sprintf((char*)str, "%s\n", "世界,你好");printf("%s\n",str);}
      

  2.   

    几行代码
    冗余一堆
    改:
    ----#include <stdio.h>void main()
    {
    wchar_t str[100];sprintf((char*)str,"%s", "世界,你好");printf("%s\n",str);
    }
      

  3.   

    我不是为了要输出"世界,你好"这几个字,我最想知道的是怎样把wchar_t输出到文件中
      

  4.   

    其实只是编码问题,LS几位的方法虽然能得到你需要的结果,但本质上还是ANSI输出,如果需要unicode输出,请看下面:#include <stdio.h>
    #include <windows.h>int _tmain(int argc, _TCHAR* argv[])
    {
    /*************************************************/
    char scp[16];
    UINT cp = GetACP();
    sprintf(scp,".%d",cp);
    setlocale( LC_ALL, scp );
    wchar_t str[100];
    swprintf(str,L"世界,你好");
    printf("%ls\n",str);
    /*************************************************/
    FILE *fp = fopen("E:\\a.txt","wb");
    if (fp)
    {
    fputc(0xFF,fp);
    fputc(0xFE,fp);
    fprintf(fp,"%s",str);
    fclose(fp);
    }
    /*************************************************/
    system("PAUSE");
    return 0;
    }1、被/*****/隔开的部分可自成一体,不存在依赖性。
    2、第一个部分的%ls输出前,必须执行一次setlocale,用来告诉控制台默认的非unicode编码是哪种。这是因为控制台不能直接显示unicode字符,你用setlocale设定之后,以后使用%ls,它会帮你自动转换成你设定的编码显示出来。
    3、unicode的文本文件头部多出两个字节,分别是FF、FE,这样的文件被记事本打开后,会自动以unicode显示。所以先写上FFFE,再以普通的内存数据写入文件即可。
      

  5.   

    又想到一点,那个fprintf(fp,"%s",str)这个写法在这里没有问题,因为L"世界,你好"中间没有'\0',但这样写是不安全,建议换成fwprintf(fp, str)。另外,写文件的时候如果使用%ls还是会转换回ANSI的,所以写文件还是不要用%ls了。
      

  6.   

    非常感谢w_anthony()的回答,我想再问问,你是那里学到这些东西的呢?
      

  7.   

    特地编程试了一下发现写文件时,先写入FFFE之后,如果用fprintf(fp, "%ls",L"你好,世界")写入的还是ANSI,如果是fwprintf(fp, L"%ls",L"你好,世界")写入的就是unicode,看来"%ls"还是可以在写unicode文件的时候用的。
      

  8.   

    有些是用多了自然发现的,有的是以前用的时候不知道,然后上网搜到答案的。
    至于unicode文件的头部的FFFE,则是无聊兴起要比较一下ANSI和unicode文件的区别,然后用UltraEdit十六进制显示的时候发现的。
    估计不会有哪本书说这些的吧?
      

  9.   

    很奇怪,看来还要更多的讨论了,我用跟你相反,你说写入的还是ansi,我用记事本打开却是黑块,而且用VS打开时却说是Unicode文件,无法打开;你说写入的是Unicode的,我可以用记事本打开看到,而且也能用VS打开,打开后就是16进制显示的,跟UE一样顺便问一下,fopen("E:\\a.txt","wb");中的第二个参数是表示什么?wb??
      

  10.   

    那当然了,因为你在头部先写了FFFE,这样的文件都会以UNICODE的方式打开,ANSI的文本却以UNICODE的方式显示,当然是乱码了,而后者写入的本身就是UNICODE字符串,UNICODE字符串以UNICODE方式显示当然正常了,记事本要是看不到那才奇怪啊。
      

  11.   

    那你应该说错了,你说“先写入FFFE之后”,其实ANSI的应该不能先写入FFFE的吧。还有,那个wb是什么啊?
      

  12.   

    我说的是fprintf和fwprintf用%ls的区别阿!
    使用fprintf和%ls,去写入unicode字符,实际上真正写入文件的还是ANSI的,这种情况下,不先写入FFFE,就不会乱码。
    但看你的要求似乎是要保存为UNICODE的文件,所以应该先写入FFFE,再配合使用fwprintf写入文件才对阿。
    "wb"表示“二进制只写”方式打开文件。