2012-02-07 66 views
0

Im使用ReadFile讀取我用WriteFile寫入文件的簡單字符串。ReadFile lpBuffer參數

有一個簡單的字符串:「測試字符串,測試Windows功能」。

使用WriteFile將其寫入文件。

現在我想使用ReadFile來確認它已寫入文件。我需要將我讀的內容與上面的原始字符串進行比較。從文件中讀取我有

DWORD dwBytesRead; 
char buff[128]; 
if(!ReadFile(hFile, buff, 128, &dwBytesRead, NULL)) 
    //Fail 

函數返回true,因此它正在從文件讀取。問題是buff只是滿足了所有的一些內容而已。我從來沒有遇到LPVOID之前,所以我不知道它是否有什麼或什麼。有沒有辦法做這個字符串比較?

編輯:我使用寫入文件中的代碼非常簡單:所以它是從文件中讀取

if(!WriteFile(hFile, sentence.c_str(), sentence.length(), &bytesWritten, NULL)) 
{ 
    //FAIL 
} 
+0

做你移動的文件指針開始的文件或重新打開它? – Abyx 2012-02-07 17:06:52

+0

你在這裏的代碼很好。問題在別處。 – 2012-02-07 17:07:11

+0

可以顯示用於寫入文件的代碼嗎? – Michael 2012-02-07 17:07:23

回答

1

文件指針需要在WriteFile()之後和ReadFile()之前回繞。按照現狀,ReadFile()不會失敗,但會讀取零字節,因此buff未更改。由於buff未初始化,因此它包含垃圾。要快退文件指針到文件的開頭使用SetFilePointer()

#include <windows.h> 
#include <iostream> 
#include <string> 

int main() 
{ 
    HANDLE hFile = CreateFile ("myfile.txt", 
           GENERIC_WRITE | GENERIC_READ, 
           0, 
           NULL, 
           OPEN_EXISTING, 
           FILE_ATTRIBUTE_NORMAL, 
           NULL); 
    if (hFile) 
    { 
     std::string sentence("a test"); 
     DWORD bytesWritten; 
     if (WriteFile(hFile, 
         sentence.c_str(), 
         sentence.length(), 
         &bytesWritten, 
         NULL)) 
     { 
      if (INVALID_SET_FILE_POINTER != SetFilePointer(hFile, 
                  0, 
                  0, 
                  FILE_BEGIN)) 
      { 
       char buf[128] = { 0 }; /* Initialise 'buf'. */ 
       DWORD bytesRead; 

       /* Read one less char into 'buf' to ensure null termination. */ 
       if (ReadFile(hFile, buf, 127, &bytesRead, NULL)) 
       { 
        std::cout << "[" << buf << "]\n"; 
       } 
       else 
       { 
        std::cerr << "Failed to ReadFile: " << 
         GetLastError() << "\n"; 
       } 
      } 
      else 
      { 
       std::cerr << "Failed to SetFilePointer: " << 
        GetLastError() << "\n"; 
      } 

     } 
     else 
     { 
      std::cerr << "Failed to WriteFile: " << GetLastError() << "\n"; 
     } 

     CloseHandle(hFile); 
    } 
    else 
    { 
     std::cerr << "Failed to open file: " << GetLastError() << "\n"; 
    } 

    return 0; 
} 
+0

是的,這是問題。謝謝,那真是令我頭疼 – discodowney 2012-02-07 18:04:45

0

該函數返回真。問題是buff只是滿足了所有的一些內容而已。

ReadFile只填充緩衝區,最大值爲dwBytesRead。如果你想用一個字符串的工作,你就必須爲空後ReadFile返回自己終止它:

buff [dwBytesRead] = 0; 
0

你不應該使用128作爲nNumberOfBytesToRead,因爲你可以得到出界,而打印字符串(或以其他方式將buff視爲0結尾的字符串)。如果它確實讀取了許多字節,並且按照@James McLaughlin的建議0終止字符串,那麼請檢查dwBytesRead

+0

使用128,它只能讀取128個字符。我有的字符串只有30個字符。我得到我可以有一個出界的問題,但如果我使用循環字符串的長度,然後我不會碰到這個問題,那麼我只需要檢查從該文件讀取的下一個字符爲空(如果多數民衆贊成如何運作,第一次做這個東西,所以不知道) – discodowney 2012-02-07 17:36:44