none
win32记事本的文件读取功能 RRS feed

  • 问题

  • BOOL PopFileRead (HWND hwndEdit, PTSTR pstrFileName)
    {
         BYTE   bySwap ;
         DWORD  dwBytesRead ;
         HANDLE hFile ;
         int    i, iFileLength, iUniTest ;
         PBYTE  pBuffer, pText, pConv ;
    
              // Open the file.
    
         if (INVALID_HANDLE_VALUE == 
                   (hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ,
                                        NULL, OPEN_EXISTING, 0, NULL)))
              return FALSE ;
    
              // Get file size in bytes and allocate memory for read.
              // Add an extra two bytes for zero termination.
                        
         iFileLength = GetFileSize (hFile, NULL) ; 
         pBuffer = (PBYTE )malloc (iFileLength + 2) ;
    
              // Read file and put terminating zeros at end.
         
         ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL) ;
         CloseHandle (hFile) ;
         pBuffer[iFileLength] = '\0' ;
         pBuffer[iFileLength + 1] = '\0' ;
    
              // Test to see if the text is Unicode
    
         iUniTest = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE ;
         
         if (IsTextUnicode (pBuffer, iFileLength, &iUniTest))
         {
              pText = pBuffer + 2 ;
              iFileLength -= 2 ;
    
              if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
              {
                   for (i = 0 ; i < iFileLength / 2 ; i++)
                   {
                        bySwap = ((BYTE *) pText) [2 * i] ;
                        ((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1] ;
                        ((BYTE *) pText) [2 * i + 1] = bySwap ;
                   }
              }
    
                   // Allocate memory for possibly converted string
    
              pConv = (PBYTE)malloc (iFileLength + 2) ;
    
                   // If the edit control is not Unicode, convert Unicode text to 
                   // non-Unicode (ie, in general, wide character).
    
    #ifndef UNICODE
              WideCharToMultiByte (CP_ACP, 0, (PWSTR) pText, -1, pConv, 
                                   iFileLength + 2, NULL, NULL) ;
    
                   // If the edit control is Unicode, just copy the string
    #else
              lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
    #endif
    
         }
         else      // the file is not Unicode
         {
              pText = pBuffer ;
    
                   // Allocate memory for possibly converted string.
    
              pConv = (PBYTE)malloc (2 * iFileLength + 2) ;
    
                   // If the edit control is Unicode, convert ASCII text.
    
    #ifdef UNICODE
              MultiByteToWideChar (CP_ACP, 0, (LPCSTR)pText, -1, (PTSTR) pConv, 
                                   iFileLength + 1) ;
    
                   // If not, just copy buffer
    #else
              lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
    #endif
         }
         
         SetWindowText (hwndEdit, (PTSTR) pConv) ;
         free (pBuffer) ;
         free (pConv) ;
       
         return TRUE ;
    }
    

    我的问题是

              if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE)

              {

                   for (i = 0 ; i < iFileLength / 2 ; i++)

                   {

                        bySwap = ((BYTE *) pText) [2 * i] ;

                        ((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1] ;

                        ((BYTE *) pText) [2 * i + 1] = bySwap ;

                   }

              }

    为什么如果文本是unicode编码的话,就要将文本的高地位反转过来??

    2011年10月8日 5:43

答案

全部回复

  • BOOL PopFileWrite (HWND hwndEdit, PTSTR pstrFileName)
    {
         DWORD  dwBytesWritten ;
         HANDLE hFile ;
         int    iLength ;
         PTSTR  pstrBuffer ;
         WORD   wByteOrderMark = 0xFEFF ;
    
              // Open the file, creating it if necessary
         
         if (INVALID_HANDLE_VALUE == 
                   (hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, 
                                        NULL, CREATE_ALWAYS, 0, NULL)))
              return FALSE ;
    
              // Get the number of characters in the edit control and allocate
              // memory for them.
         
         iLength = GetWindowTextLength (hwndEdit) ;
         pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)) ;
         
         if (!pstrBuffer)
         {
              CloseHandle (hFile) ;
              return FALSE ;
         }
    
              // If the edit control will return Unicode text, write the
              // byte order mark to the file.
    
    #ifdef UNICODE
         WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
    #endif
    
              // Get the edit buffer and write that out to the file.
         
         GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;
         WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR), 
                    &dwBytesWritten, NULL) ;
         
         if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten)
         {
              CloseHandle (hFile) ;
              free (pstrBuffer) ;
              return FALSE ;
         }
         
         CloseHandle (hFile) ;
         free (pstrBuffer) ;
         
         return TRUE ;
    } 
    

    WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;

    google上找到【如果创建unicode格式的文本的话,就要先写入反转标志】??

    (地址:http://zhidao.baidu.com/question/201210473.html

    这句话应该很有意思的,但是我不明白他什么意思。

    这是否是unicode的硬性规定啊??

    在程序当中还特地把wByteOrderMark 的值设置为0xFEFF
     WORD wByteOrderMark = 0xFEFF ;

    望前辈解答
    • 已合并 Rob Pan 2011年10月10日 9:43
    2011年10月8日 5:51
  • Unicode:编码是前两个字节是0xFF, 0xFE,就是litter endian,如果是0xFE, 0xFF就是big endian。
    类似的UTF8编码的话前三个字节是0xEF, 0xBB, 0xBF,这表示是UTF8的编码。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年10月14日 3:19
    2011年10月8日 8:28
    版主
  • 为什么如果文本是unicode编码的话,就要将文本的高地位反转过来??
    litter/big endian的问题吗?
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年10月8日 8:59
    版主
  • VisualEleven很感谢你的回答。

    但是我还是有一事不明,那就是为什么它要将字符高地位掉转?

     

              if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE)

              {

                   for (i = 0 ; i < iFileLength / 2 ; i++)

                   {

                        bySwap = ((BYTE *) pText) [2 * i] ;

                        ((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1] ;

                        ((BYTE *) pText) [2 * i + 1] = bySwap ;

                   }

              }

    能否留下您的邮箱,希望可以多多交流。


    2011年10月8日 12:20
  • 你好,

     

    会发生高低位的转换是因为字符串在内存中的存储规则所指。具体说明你可以参考一下地址:http://blog.sina.com.cn/s/blog_56b96c5a0100u365.html


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年10月14日 3:18
    2011年10月11日 8:51