[英]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.