2009-06-09 4 views
0

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

благодарит робота за редактирование моего сообщения. – Bopha

+0

Не ваша главная проблема, но вы смешиваете и сопоставляете wchar_t и TCHAR. mbstowcs() преобразует из char * в wchar_t *. TCHAR может быть либо char, либо wchar_t. Если вы хотите использовать wchar_t, используйте его. Если вы хотите использовать TCHAR, вам нужно проверить, что вам нужно mbstowcs() или нет. –

+0

s/whetehr/is/ –

ответ

0

Либо удалите символ новой строки из файла или использовать _tcsstr для проверки наличия строки «Привет Добро пожаловать на C++».

+0

после того, как вы предложили изменить _tcscmp на _tcsstr, он работает для компиляции, спасибо. Что в моем текстовом файле имеет числовое значение, и я должен использовать это значение, поэтому мой readBuffer будет содержать дополнительные символы рядом с номером? К сожалению, я не могу изменить содержимое текстового файла, потому что он написан другой программой другими людьми, поэтому мне просто нужно читать как есть. – Bopha

2

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

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

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

+0

Вы правы.Я не буду использовать ByteReading, но я буду использовать 256 в ReadFile(). FindClose(), он использовался в моей другой программе, и это требовалось, но эта программа не нуждается в этом, поэтому я прокомментировал все. И closeHandle(), я не должен просто помещать внутри сравнения строк, он должен быть вне выражения if. На самом деле Это небольшой код части, который я смазываю и вставляю из своей программы, поэтому ему не хватает некоторых утверждений. – Bopha

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 достаточно
Смежные вопросы