2013-08-20 3 views
0

Я написал программу поиска файла с помощью функции FindFirstFile(...). Но когда я пытаюсь распечатать вывод этой функции, в консольных окнах напечатано несколько строк неизвестных символов. Я прочитал несколько сообщений, там было написано, чтобы попытаться использовать wcout вместо cout. Я стараюсь, но это не помогает. Я думаю, что проблема заключается в различии между кодировками ANSI и UNICODE. Может кто-нибудь мне помочь? Я буду очень благодарен за любую помощь!C++, вывод FindFirstFile()

Вот мой код:

#include "FindFile.h" 
#include <iostream> 
using namespace std; 

void FindFileCl::Execute(Input * input, Response * response) 
{ 
    WIN32_FIND_DATAA FindFileData; 

    HANDLE h = FindFirstFileA((input->FileName).c_str(), // name of the file 

     &FindFileData); 
    if (h) 
    { 



     cout << "Search Results:\n"; 

     cout<<(FindFileData.cFileName); 


     CloseHandle(h); 
    } 
    else 
    { 
     cerr << "File is NOT found:" << GetLastError() << "\n"; 
    } 




} 
+0

Попробуйте использовать FindFirstFile, а не 'FindFirstFileA', и создайте свою программу в Unicode. Используйте 'chcp 65001' в консоли, чтобы изменить кодовую страницу на UTF-8. –

+0

Благодарим за ответ, Неманья Борич. Я попытался использовать FindFirstFile вместо FindFirstFileA, но затем он вызывает проблемы с первым параметром функции, поэтому я использую FindFirstFileA. – Victor

+0

О, вам нужно использовать 'WIN32_FIND_DATA' вместо' WIN32_FIND_DATAA'. –

ответ

1

Если FindFirstFile() не удается, то возвращается INVALID_HANDLE_VALUE, не NULL:

Если функция завершается с ошибкой или не может найти файлы из строки поиска в параметре lpFileName, возвращаемое значение равно INVALID_HANDLE_VALUE, а содержимое lpFindFileData является неопределенным. Чтобы получить расширенную информацию об ошибке, вызовите функцию GetLastError.

и INVALID_HANDLE_VALUE является #define д, как -1 (следующий макрос, расположенный в WinBase.h):

#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1) 

означая if (h) будут введены в любом успеха или неудачи. В случае сбоя cFileName не будет изменен, что приведет к печати нежелательной почты, поскольку она не инициализирована. Изменение состояния if явно проверить INVALID_HANDLE_VALUE:

if (h != INVALID_HANDLE_VALUE) 
{ 
} 
+0

Большое спасибо, hmjd! Я сделал, как вы сказали, и странные персонажи не печатаются! Все работает! Вы мне очень помогли! Спасибо! – Victor

0

Один из «наименее плохих» способов было бы преобразовать имя Unicode в кодировку консоли.

Для этого я предлагаю компиляции в Unicode (Там есть вариант проекта для этого в Visual Studio> = 8, в противном случае вы должны определить, как UNICODE и _UNICODE вручную), используя версию TCHAR из FindFirstFile(), а затем с помощью CharToOem() или CharToOemBuff() (ни один из них не идеален). - Или поочередно используйте версию W, за которой следует WideCharToMultiByte (CP_OEMCP).

+0

Спасибо за ответ, Medinoc. hmjd также ответил на мой вопрос, я сделал, как он сказал, и моя программа работает. Хотелось бы поблагодарить вас за ваш ответ! – Victor

Смежные вопросы