Проблема с использованием ReadFile () для чтения строки из текстового файла - PullRequest
0 голосов
/ 09 июня 2009

Как я могу сделать код ниже, чтобы прочитать правильный текст. В моем текстовом файле есть привет добро пожаловать в 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!"));
        }
    }
}

Спасибо,

Ответы [ 3 ]

2 голосов
/ 09 июня 2009

Есть несколько проблем:

  • Вы передаете неинициализированные данные (byteReading) как параметр «# байтов для чтения» в ReadFile ().
  • В зависимости от того, как вы создали файл, содержимое файла может не иметь завершающего 0 байт. Код предполагает наличие терминатора.
  • FindClose (hFile) не имеет смысла. CloseHandle (hFile) - это все, что вам нужно.
  • Вам необходимо вызвать CloseHandle, если CreateFile () завершился успешно. В настоящее время вы вызываете его, только если вы нашли искомую строку.

Это не ошибка, но полезно инициализировать ваши буферы нулями. Это облегчает просмотр в отладчике того, сколько именно данных читается.

2 голосов
/ 09 июня 2009
  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 достаточно
0 голосов
/ 09 июня 2009

Либо удалите символ новой строки из файла, либо используйте _tcsstr для проверки существования строки «Hello Welcome to C ++».

...