none
为什么用文件流读取txt文件得到的是乱码? RRS feed

  • 问题

  •  ifstream input;
     input.open("D:\\Visual Studio 2005\\Projects\\test\\test\\res\\算法\\ALGO1001.txt");
     if(!input.is_open())
     {
      this->MessageBox(_T("算法文件打开错误!"));
     }
     string temp;
     input>>temp;
     CString tt;
     tt.Format(_T("%s"),temp.c_str());
     //tt.Format(_T("%s"),temp);
     this->MessageBox(tt);
     input.close();
    但是在消息框中显示的是乱码,这是在VC中的一段代码。
    2009年5月22日 8:07

答案

  • 我是尝试使用ifstream的。我试了一下以下代码:
    Cstring tt;
    tt.Format(_T("%ls"),"void InsertSort");
    pDC->TextOut(0,0,tt);
    结果是乱码,如果把tt.Format(_T("%ls"),"void InsertSort");替换为tt.Format(_T("%ls"),L"void InsertSort");
    结果就正确了,"void InsertSort"属于ANSI字符串而L"void InsertSort"属于Unicode字符串。
    但是我不知道怎么把换行符号加进去,如果字符串变为L"void InsertSort /n"
    结果就显示为void InsertSort |         不知道为什么会出现符号"|".

    换行符应该是'\n',不是'/n'。
    回车换行符是'\r\n'.
    2009年5月28日 0:45

全部回复

  • 你把他所有的汉字都换成英文试试能不能正常显示.若全是英文能的话,就是你的编译器不支持中文.若还是不能,把你的运行环境和编译器版本贴上来.
    Hello world
    2009年5月22日 13:16
    版主
  • 看是不是unicode的问题。
    需要打开的文件跟你程序所用设置是否匹配。

    2009年5月23日 5:17
  • 汗,我还以为你说的this->MessageBox(_T("算法文件打开错误!"));这个显示是乱码.....

    txt文件的编码格式有很多的,一般在文件的前两个字节说明该文件是什么格式,Unicode的txt文件前两个字节是0xFF和0xFE, utf-8是0xEF, 0xBB, 0xBF
    Unicode big endian是0xFE, 0xFF其他就是ANSI.

    MessageBox调用的是MessageBoxW输入文字必须是Unicode才能显示,要是其他格式就会出现乱码.
    可以用MultiByteToWideCharWideCharToMultiByte进行格式转换
    Hello world
    2009年5月23日 7:54
    版主
  • 可能是UNICODE问题。
    用wifstream
    string也用wstring
    麻烦把正确答案设为解答。
    2009年5月23日 9:56
    版主
  • 可能是UNICODE问题。
    用wifstream
    string也用wstring
    麻烦把正确答案设为解答。

    仍然不能解决,还是乱码!
    void InsertSort(SqList &L) {  // 算法10.1
      // 对顺序表L作直接插入排序。
      int i,j;
      for (i=2; i<=L.length; ++i)
        if (LT(L.r[i].key, L.r[i-1].key)) { 
          // "<"时,需将L.r[i]插入有序子表
          L.r[0] = L.r[i];                 // 复制为哨兵
          for (j=i-1;  LT(L.r[0].key, L.r[j].key);  --j)
            L.r[j+1] = L.r[j];             // 记录后移
          L.r[j+1] = L.r[0];               // 插入到正确位置
        }
    } // InsertSort
    上面是算法文件,txt的unicode编码方式,现在可以读出来一个单词void后面跟着几个乱码。
    从文本文件中读内容到string中,string碰到空格就停止了,按说应该只有一个void不知道问什么会有乱码,按照楼主的试了一下全都是乱码了。
    2009年5月24日 6:33
  • 汗,我还以为你说的this->MessageBox(_T("算法文件打开错误!"));这个显示是乱码.....

    txt文件的编码格式有很多的,一般在文件的前两个字节说明该文件是什么格式,Unicode的txt文件前两个字节是0xFF和0xFE, utf-8是0xEF, 0xBB, 0xBF
    Unicode big endian是0xFE, 0xFF其他就是ANSI.

    MessageBox调用的是MessageBoxW输入文字必须是Unicode才能显示,要是其他格式就会出现乱码.
    可以用MultiByteToWideCharWideCharToMultiByte进行格式转换
    Hello world

    我在视图窗口中输出了一下还是有乱码,而且算法文件就是unicode编码方式,我存储的时候选择编码方式了。
    2009年5月24日 6:35
  • 我估计是ifstream的问题,你用ReadFile把文件读到一个缓冲里.

    #include <windows.h>

    int _stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
     HANDLE hFile = ::CreateFile(TEXT("a.txt"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0x80, 0);
     if(hFile == INVALID_HANDLE_VALUE)
      return 1;  
     DWORD nSize = ::GetFileSize(hFile, NULL);
     BYTE* Buffer = new BYTE[nSize + 2];
     ZeroMemory(Buffer, nSize + 2);
     ::ReadFile(hFile, Buffer, nSize, &nSize, 0);
     ::MessageBox(0, (TCHAR*)(Buffer + sizeof(WORD)), 0, MB_OK);
     delete Buffer;
     return 0;
    }

    一个简单的读取Unicode文件的例子.你试试.


    Hello world
    2009年5月24日 16:16
    版主
  • 我是尝试使用ifstream的。我试了一下以下代码:
    Cstring tt;
    tt.Format(_T("%ls"),"void InsertSort");
    pDC->TextOut(0,0,tt);
    结果是乱码,如果把tt.Format(_T("%ls"),"void InsertSort");替换为tt.Format(_T("%ls"),L"void InsertSort");
    结果就正确了,"void InsertSort"属于ANSI字符串而L"void InsertSort"属于Unicode字符串。
    但是我不知道怎么把换行符号加进去,如果字符串变为L"void InsertSort /n"
    结果就显示为void InsertSort |         不知道为什么会出现符号"|".
    2009年5月25日 16:15
  • 难道说是字符串没有以'\0'结尾?
    你在最后加个'\0'看看
    Hello world
    2009年5月26日 2:03
    版主
  • 检查一下你的ALGO10001.txt文件的格式 可用记事本打开另存为看下
    努力着就不会放弃!http://hi.baidu.com/1987raymond
    2009年5月27日 5:08
    版主
  • 我是尝试使用ifstream的。我试了一下以下代码:
    Cstring tt;
    tt.Format(_T("%ls"),"void InsertSort");
    pDC->TextOut(0,0,tt);
    结果是乱码,如果把tt.Format(_T("%ls"),"void InsertSort");替换为tt.Format(_T("%ls"),L"void InsertSort");
    结果就正确了,"void InsertSort"属于ANSI字符串而L"void InsertSort"属于Unicode字符串。
    但是我不知道怎么把换行符号加进去,如果字符串变为L"void InsertSort /n"
    结果就显示为void InsertSort |         不知道为什么会出现符号"|".

    换行符应该是'\n',不是'/n'。
    回车换行符是'\r\n'.
    2009年5月28日 0:45
  • 会不会和编码有关系!你把内容写为数字或字母试试……


    那晚过后,我比别人重21克……
    2009年7月9日 15:53