我有一个文件 C:\ demo \ Demo.txt ,它有一个简单的" Hello,world "在上面。我想将路径作为参数传递给我的应用程序,用CreateFile
打开它,用ReadFile
读取它并在控制台上显示该行。但是,我收到错误代码998
:
对内存位置的无效访问。
这是我的代码:
int wmain(int argc, WCHAR **argv)
{
if (argc != 2)
{
fwprintf(stderr, L"\nWrong arguments. \n");
return 1;
}
// CreateFile function variables
HANDLE hSourceFile;
LPCWSTR fileName = (LPCWSTR)argv[1];
DWORD desiredAccess = FILE_GENERIC_READ;
DWORD shareMode = FILE_SHARE_READ;
DWORD creationDisposition = OPEN_EXISTING;
DWORD flagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
//---------------------------------------------------------------
// Opening file for reading data
hSourceFile = CreateFileW(
fileName,
desiredAccess,
shareMode,
NULL,
creationDisposition,
flagsAndAttributes,
NULL);
if (hSourceFile != INVALID_HANDLE_VALUE)
{
wprintf(L"\nThe source file, %s, is open. \n", fileName);
}
else
{
wprintf(L"Error code: %u\n", GetLastError());
}
// ReadFile function variables
LPVOID dataRead=NULL;
DWORD bytesToRead = 100;
DWORD bytesWritten = 0;
//-----------------------------------------------------------------
// Reading data from file
if (!ReadFile(
hSourceFile,
dataRead,
bytesToRead,
&bytesWritten,
NULL))
{
wprintf(L"Error code: %u\n", GetLastError());
return 1;
}
wprintf(L"%s. \n", (LPWSTR)dataRead);
CloseHandle(hSourceFile);
return 0;
}
我第一次使用ReadFile
,所以不知道我做错了什么。
你能帮助我吗?
答案 0 :(得分:2)
index
想要一个指向缓冲区的指针,它可以将数据写入其中。您正在传递NULL,因此您会收到错误。
我会将代码更改为
ReadFile
您遇到的下一个问题是,您正在将指针转换为 // ReadFile function variables
static const DWORD bytesToRead = 100;
unsigned char dataRead[bytesToRead];
DWORD bytesWritten = 0;
//-----------------------------------------------------------------
// Reading data from file
if (!ReadFile(
hSourceFile,
dataRead,
bytesToRead,
&bytesWritten,
NULL))
{
wprintf(L"Error code: %u\n", GetLastError());
return 1;
}
,这是指向以null结尾的宽字符串的指针。您的文件是否包含该空终止?或者你需要自己添加吗?假设文件不包含终止,您可能需要:
LPWSTR
答案 1 :(得分:1)
您必须在要将读取字节放入的位置分配内存缓冲区。现在你指针dataRead
指向nullptr
,换句话说无处,但你传递的大小为100,表明你的指针指向100字节分配的缓冲区,这不是真理。