簡體   English   中英

ReadFile lpBuffer參數

[英]ReadFile lpBuffer parameter

我正在使用ReadFile讀取我使用WriteFile寫入文件的簡單字符串。

有一個簡單的字符串:“測試字符串,測試Windows函數”。

使用WriteFile將其寫入文件。

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

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

該函數返回true,因此正在從文件讀取。 問題是,僅僅只是一個完整的buff就被buff淹沒了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 我之前從未接觸過LPVOID,所以我不知道它是否存在。 有沒有辦法進行字符串比較?

編輯:我用來寫入文件的代碼非常簡單:

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

文件指針需要在WriteFile()ReadFile()之前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;
}

該函數返回true,因此正在從文件讀取。 問題是,僅僅只是一個完整的buff就被buff淹沒了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

ReadFile僅將緩沖區填充到dwBytesRead的值。 如果您嘗試使用字符串,則必須在ReadFile返回后ReadFile終止它:

buff [dwBytesRead] = 0;

您不應將128用作nNumberOfBytesToRead ,因為您在打印字符串時可能會越界(或者將buff視為以0結尾的字符串)。 還要檢查dwBytesRead是否確實讀取了那么多字節,並按@James McLaughlin的建議以0終止該字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM