2009-06-09 129 views
0

如何使以下代碼能夠讀取正確的文本。在我的文本文件中,歡迎使用C++,但是在文本末尾,它有一個新行。用下面的代碼,我的readBuffer總是包含額外的字符。使用ReadFile()從文本文件中讀取字符串時遇到問題

DWORD byteWritten; 
int fileSize = 0; 

//Use CreateFile to check if the file exists or not. 
HANDLE hFile = CreateFile(myFile, GENERIC_READ, FILE_SHARE_READ, NULL, 
          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

if(hFile != INVALID_HANDLE_VALUE) 
{ 
    BOOL readSuccess; 
    DWORD byteReading; 
    char readBuffer[256]; 
    readSuccess = ReadFile(hFile, readBuffer, byteReading, &byteReading, NULL); 

    if(readSuccess == TRUE) 
    { 
     TCHAR myBuffer[256]; 
     mbstowcs(myBuffer, readBuffer, 256); 

     if(_tcscmp(myBuffer, TEXT("Hello welcome to C++")) == 0) 
     { 
      FindClose(hFile); 
      CloseHandle(hFile); 

      WriteResultFile(TRUE, TEXT("success!")); 
     } 
    } 
} 

感謝,

+0

感謝robbotic編輯我的文章。 – Bopha 2009-06-09 20:44:47

+0

不是你的主要問題,但你是混合和匹配wchar_t和TCHAR。 mbstowcs()從char *轉換爲wchar_t *。 TCHAR可能是char或wchar_t。如果你想使用wchar_t,那就使用它。如果你想使用TCHAR,那麼你需要測試你需要mbstowcs()與否。 – 2009-06-10 06:07:38

+0

s/whetehr /是/ – 2009-06-10 06:08:40

回答

0

無論是從文件中刪除新行字符或使用_tcsstr檢查字符串「Hello歡迎C++」的存在。

2

有幾個問題:

  • 你傳遞未初始化的數據(byteReading)作爲 「字節#改爲」 參數對ReadFile()。
  • 根據您創建文件的方式,文件的內容可能沒有終止0字節。該代碼假定終止符存在。
  • FindClose(hFile)沒有意義。 CloseHandle(hFile)是你所需要的。
  • 如果CreateFile()成功,您需要調用CloseHandle。目前,只有當您找到您要查找的字符串時纔會調用它。

這不是一個錯誤,但它有助於零初始化緩衝區。這使得在調試器中更容易看到正在讀取多少數據。

2
HANDLE hFile = CreateFile(myfile, GENERIC_READ, FILE_SHARE_READ, NULL, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

    if(hFile != INVALID_HANDLE_VALUE) 
    { 
    BOOL readSuccess; 
    DWORD byteReading = 255; 
    char readBuffer[256]; 
    readSuccess = ReadFile(hFile, readBuffer, byteReading, &byteReading, NULL); 
    readBuffer[byteReading] = 0; 
    if(readSuccess == TRUE) 
    { 
     TCHAR myBuffer[256]; 
     mbstowcs(myBuffer, readBuffer, 256); 

     if(_tcscmp(myBuffer, TEXT("Hello welcome to C++")) == 0) 
     { 
     rv = 0; 
     } 
    } 
    CloseHandle(hFile); 
    } 

我看到兩件事情:

  • 你正在讀取字節

    • byteReading沒有初始化,所以你必須用0
    • CloseHandle的終止字符串是足夠