我正在使用ReadFile读取一个使用WriteFile写入文件的简单字符串。
有一个简单的字符串:“测试字符串,测试窗口函数”。
使用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 :(得分: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;
}
答案 1 :(得分:0)
该函数返回true,因此它正在从文件中读取。问题是buff只有ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ。
ReadFile
仅将缓冲区填充到dwBytesRead
的值。如果您正在尝试使用字符串,则必须在ReadFile
返回后自行终止它:
buff [dwBytesRead] = 0;
答案 2 :(得分:0)
您不应该使用128作为nNumberOfBytesToRead
,因为您可以在打印字符串时超出范围(或者将buff
视为以0结尾的字符串)。同时检查dwBytesRead
是否确实读取了那么多字节,并按照@James McLaughlin的建议0终止字符串。