C++ 使用ReadFile()从文本文件读取字符串时出现问题
如何使下面的代码阅读正确的文本。在我的文本文件中,欢迎大家欢迎C++,但是在文本的结尾,它有一个新的行。对于下面的代码,我的readBuffer总是包含额外的字符C++ 使用ReadFile()从文本文件读取字符串时出现问题,c++,winapi,file-io,windows-ce,C++,Winapi,File Io,Windows Ce,如何使下面的代码阅读正确的文本。在我的文本文件中,欢迎大家欢迎C++,但是在文本的结尾,它有一个新的行。对于下面的代码,我的readBuffer总是包含额外的字符 DWORD byteWritten; int fileSize = 0; //Use CreateFile to check if the file exists or not. HANDLE hFile = CreateFile(myFile, GENERIC_READ, FILE_SHARE_READ, NULL,
DWORD byteWritten;
int fileSize = 0;
//Use CreateFile to check if the file exists or not.
HANDLE hFile = CreateFile(myFile, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
BOOL readSuccess;
DWORD byteReading;
char readBuffer[256];
readSuccess = ReadFile(hFile, readBuffer, byteReading, &byteReading, NULL);
if(readSuccess == TRUE)
{
TCHAR myBuffer[256];
mbstowcs(myBuffer, readBuffer, 256);
if(_tcscmp(myBuffer, TEXT("Hello welcome to C++")) == 0)
{
FindClose(hFile);
CloseHandle(hFile);
WriteResultFile(TRUE, TEXT("success!"));
}
}
}
谢谢,请从文件中删除新行字符或使用_tcsstr检查字符串“Hello Welcome to C++”是否存在请从文件中删除新行字符或使用_tcsstr检查字符串“Hello Welcome to C++”是否存在存在一些问题:
- 您正在将未初始化的数据(byteReading)作为“#要读取的字节数”参数传递给ReadFile()
- 根据创建文件的方式,文件内容可能没有终止0字节。代码假定存在终止符
- FindClose(hFile)没有意义。CloseHandle(hFile)是您所需要的全部
- 如果CreateFile()成功,则需要调用CloseHandle。目前,只有在找到要查找的字符串时才调用它
这不是一个bug,但是零初始化缓冲区是很有帮助的。这使得在调试器中更容易准确地查看读取了多少数据。存在一些问题:
HANDLE hFile = CreateFile(myfile, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
BOOL readSuccess;
DWORD byteReading = 255;
char readBuffer[256];
readSuccess = ReadFile(hFile, readBuffer, byteReading, &byteReading, NULL);
readBuffer[byteReading] = 0;
if(readSuccess == TRUE)
{
TCHAR myBuffer[256];
mbstowcs(myBuffer, readBuffer, 256);
if(_tcscmp(myBuffer, TEXT("Hello welcome to C++")) == 0)
{
rv = 0;
}
}
CloseHandle(hFile);
}
- 您正在将未初始化的数据(byteReading)作为“#要读取的字节数”参数传递给ReadFile()
- 根据创建文件的方式,文件内容可能没有终止0字节。代码假定存在终止符
- FindClose(hFile)没有意义。CloseHandle(hFile)是您所需要的全部
- 如果CreateFile()成功,则需要调用CloseHandle。目前,只有在找到要查找的字符串时才调用它
HANDLE hFile = CreateFile(myfile, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
BOOL readSuccess;
DWORD byteReading = 255;
char readBuffer[256];
readSuccess = ReadFile(hFile, readBuffer, byteReading, &byteReading, NULL);
readBuffer[byteReading] = 0;
if(readSuccess == TRUE)
{
TCHAR myBuffer[256];
mbstowcs(myBuffer, readBuffer, 256);
if(_tcscmp(myBuffer, TEXT("Hello welcome to C++")) == 0)
{
rv = 0;
}
}
CloseHandle(hFile);
}
我看到两件事:
- byteReading未初始化
- 您正在读取字节,因此必须以0结束字符串
- 关闭手柄就足够了
- byteReading未初始化
- 您正在读取字节,因此必须以0结束字符串
- 关闭手柄就足够了