2009-06-09 131 views
0

如何使以下代码能够读取正确的文本。在我的文本文件中,欢迎使用C++,但是在文本末尾,它有一个新行。用下面的代码,我的readBuffer总是包含额外的字符。使用ReadFile()从文本文件中读取字符串时遇到问题

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!")); 
     } 
    } 
} 

感谢,

+0

感谢robbotic编辑我的文章。 – Bopha 2009-06-09 20:44:47

+0

不是你的主要问题,但你是混合和匹配wchar_t和TCHAR。 mbstowcs()从char *转换为wchar_t *。 TCHAR可能是char或wchar_t。如果你想使用wchar_t,那就使用它。如果你想使用TCHAR,那么你需要测试你需要mbstowcs()与否。 – 2009-06-10 06:07:38

+0

s/whetehr /是/ – 2009-06-10 06:08:40

回答

0

无论是从文件中删除新行字符或使用_tcsstr检查字符串“Hello欢迎C++”的存在。

2

有几个问题:

  • 你传递未初始化的数据(byteReading)作为 “字节#改为” 参数对ReadFile()。
  • 根据您创建文件的方式,文件的内容可能没有终止0字节。该代码假定终止符存在。
  • FindClose(hFile)没有意义。 CloseHandle(hFile)是你所需要的。
  • 如果CreateFile()成功,您需要调用CloseHandle。目前,只有当您找到您要查找的字符串时才会调用它。

这不是一个错误,但它有助于零初始化缓冲区。这使得在调试器中更容易看到正在读取多少数据。

2
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
    • CloseHandle的终止字符串是足够