在 C++ 中使用 ReadFIle() 函数时无法从文件中读取
Posted
技术标签:
【中文标题】在 C++ 中使用 ReadFIle() 函数时无法从文件中读取【英文标题】:Unable to Read from File while using ReadFIle() function in C++ 【发布时间】:2014-11-07 05:38:10 【问题描述】:我在使用 C++ 的 ReadFile() 函数从文件中读取数据时遇到了一些问题(可能是微软特有的)。
这是我的代码
写入文件
void ClientA::SharePublicKey()
printf("Sharing Public Key\n");
HANDLE hFile = NULL;
hFile = CreateFile(TEXT("D:\\My_Proj\\shared\\PublicKeyB.txt"), // name of the write
GENERIC_WRITE, // open for writing
FILE_SHARE_WRITE, // do not share
NULL, // default security
CREATE_NEW, // create new file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
//DisplayError(TEXT("CreateFile"));
//_tprintf(TEXT("Terminal failure: Unable to open file \"%s\" for write.\n"), argv[1]);
return;
// _tprintf(TEXT("Writing %d bytes to %s.\n"), dwBytesToWrite, argv[1]);
bool bErrorFlag = WriteFile(
hFile, // open file handle
pbPublicKey, // start of data to write
dwPublicKeyLen, // number of bytes to write
&lpNumberOfBytesWritten, // number of bytes that were written
NULL); // no overlapped structure
if (FALSE == bErrorFlag)
// DisplayError(TEXT("WriteFile"));
printf("Terminal failure: Unable to write to file.\n");
return;
else
if (lpNumberOfBytesWritten != dwPublicKeyLen)
// This is an error because a synchronous write that results in
// success (WriteFile returns TRUE) should write all data as
// requested. This would not necessarily be the case for
// asynchronous writes.
printf("Error: dwBytesWritten != dwBytesToWrite\n");
else
// _tprintf(TEXT("Wrote %d bytes to %s successfully.\n"), dwBytesWritten, argv[1]);
CloseHandle(hFile);
读取该文件
void ClientA::ReadPublicKeyOfOtherPeer()
HANDLE hFile = NULL;
DWORD dwBytesRead = 0;
BYTE* ReadBuffer = NULL;
OVERLAPPED ol = 0;
hFile = CreateFile(TEXT("D:\\My_Proj\\shared\\PublicKeyB.txt"), // file to open
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // normal file
NULL // no attr. template
);
if (hFile == INVALID_HANDLE_VALUE)
_tprintf(TEXT("CreateFile\n"));
_tprintf(TEXT("Terminal failure: unable to open file \"%s\" for read.\n"));
printf("Error %x\n", GetLastError());
return;
if( FALSE == ReadFile(hFile, ReadBuffer, dwPublicKeyLen, &lpNumberOfBytesWritten, &ol) )
// DisplayError(TEXT("ReadFile"));
printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError());
CloseHandle(hFile);
return;
if (dwBytesRead > 0 && dwBytesRead <= dwPublicKeyLen-1)
ReadBuffer[dwBytesRead]='\0'; // NULL character
//_tprintf(TEXT("Data read from %s (%d bytes): \n"), argv[1], dwBytesRead);
printf("%s\n", ReadBuffer);
else if (dwBytesRead == 0)
//_tprintf(TEXT("No data read from file %s\n"), argv[1]);
else
// printf("\n ** Unexpected value for dwBytesRead ** \n");
retrievedPublicByteArray = ReadBuffer;
CloseHandle(hFile);
通过 SharePublicKey 方法我将数据保存在文件中。并且我已经检查它是否成功保存了文件上的数据,并且文件上的数据似乎是有效的。
通过 ReadPublicKeyOfOtherPeer 方法,我正在读取之前保存的文件。但是读取不成功在输出中我找到了以下行 -
终端故障:无法从文件中读取。 GetLastError=000003e6
【问题讨论】:
我认为这是一个ERROR_NOACCESS
- 你确定读者有权访问该文件,并且没有其他任何东西可以独占锁定它吗?
函数失败后立即获取GetLastError
。所有这些介入的_tprintf
调用很可能会被覆盖。
另外,您调用_tprintf
的格式字符串具有%s
说明符,但没有参数。
您确定您没有收到ERROR_IO_PENDING
(0x3E5) 吗?当您像这样启动对异步文件句柄的读取时,这是预期的错误代码。
不,我得到 0x3e6。是的,读者有权限访问。
【参考方案1】:
您将未初始化的指针 ReadBuffer 传递给 ReadFile。您需要一个足够大的缓冲区来接收结果。
【讨论】:
以上是关于在 C++ 中使用 ReadFIle() 函数时无法从文件中读取的主要内容,如果未能解决你的问题,请参考以下文章
“ReadFile 函数”有没有办法让我不再声明要读取的特定字节数?
C++ 管道/ReadFile lpNumberOfBytesRead/DLL
在 Meteor 中使用 fs 模块获取未捕获的 TypeError _fs2.default.readFile 不是函数