C++ 使用ReadFile()从文本文件读取字符串时出现问题

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,

如何使下面的代码阅读正确的文本。在我的文本文件中,欢迎大家欢迎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, 
                            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。目前,只有在找到要查找的字符串时才调用它
这不是一个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未初始化
  • 您正在读取字节,因此必须以0结束字符串
  • 关闭手柄就足够了
我看到两件事:

  • byteReading未初始化
  • 您正在读取字节,因此必须以0结束字符串
  • 关闭手柄就足够了

按照您的建议将_tcscmp更改为_tcsstr后,它对社区有效,谢谢。我的文本文件中有什么是数值,我必须使用该值,以便我的readBuffer在数字旁边包含额外的字符?不幸的是,我无法更改文本文件内容,因为它是由其他人编写的,所以我只能按原样阅读。在按照您的建议将_tcscmp更改为_tcssr后,它对比较有效,谢谢。我的文本文件中有什么是数值,我必须使用该值,以便我的readBuffer在数字旁边包含额外的字符?不幸的是,我不能更改文本文件的内容,因为它是由其他人编写的,所以我只能按原样阅读。你是对的。我将不使用ByteReading,但我将在ReadFile()中使用256。FindClose(),它曾在我的另一个程序中使用,它是必需的,但这个程序不需要它,所以我已全部注释掉。和closeHandle(),我不应该把它放在字符串比较中,它也应该放在if语句之外。实际上,这是我从程序中粘贴的一小部分代码,所以它缺少一些语句。你说得对。我将不使用ByteReading,但我将在ReadFile()中使用256。FindClose(),它曾在我的另一个程序中使用,它是必需的,但这个程序不需要它,所以我已全部注释掉。和closeHandle(),我不应该把它放在字符串比较中,它也应该放在if语句之外。事实上,这是我从程序中粘贴的一小部分代码,因此它缺少一些语句。感谢robbotic编辑我的帖子。这不是你的主要问题,但你是混合和匹配wchar\u t和TCHAR。mbstowcs()将字符*转换为wchar\u t*。TCHAR可以是char或wchar\t。如果您想使用wchar\t,请使用它。如果你想使用TCHAR,那么你需要测试你是否需要mbstowcs()。谢谢,我已经将mbstowcs改为MultiByteToWideChar()。从文本行的每一行的新行开始,当我执行ReadFile()时,总会有一行。因为我不知道其他方法,所以我只是使用一种旧的样式来消除新行:int index=0;字符缓冲区[256]={'\0'};虽然(readBuffer[index]!='\r'){buffer[index]=readBuffer[index];index++;}所以这只是忽略新行。感谢robbotic编辑我的文章。这不是你的主要问题,但你是混合和匹配wchar\u t和TCHAR。mbstowcs()将字符*转换为wchar\u t*。TCHAR可以是char或wchar\t。如果您想使用wchar\t,请使用它。如果你想使用TCHAR,那么你需要测试你是否需要mbstowcs()。谢谢,我已经将mbstowcs改为MultiByteToWideChar()。从文本行的每一行的新行开始,当我执行ReadFile()时,总会有一行。因为我不知道其他方法,所以我只是使用一种旧的样式来消除新行:int index=0;字符缓冲区[256]={'\0'};而(readBuffer[index]!='\r'){buffer[index]=readBuffer[index];index++;}所以这只是忽略新行。