Russian Qt Forum

Qt => Вопросы новичков => Тема начата: 4ippers от Март 02, 2016, 17:24



Название: Qt Creator(MiniGW) и WINAPi
Отправлено: 4ippers от Март 02, 2016, 17:24
Привет, ребята подскажите пожалуйста. Есть такой код
Код:
#include <stdlib.h>
#include <iostream>
#include "windows.h"


int main(int argc, char *argv[])
{

    setlocale(LC_ALL,"");
    std::cout<<argc<<std::endl;
    std::cout<<argv<<std::endl;

    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
    hf=FindFirstFile(L"E:\\*", &FindFileData);
    if (hf!=INVALID_HANDLE_VALUE)
        {
            do
            {
            std:: cout << FindFileData.cFileName << "   "<<FindFileData.nFileSizeLow<<std::endl;
            }
            while (FindNextFile(hf,&FindFileData)!=0);
            FindClose(hf);
        }

    return 0;
}

Но вместо названий файлов, выводит какой-то код. Хотя в VS, тот же самый код нормально обрабатывает, что делать?
Результат во вложение


Название: Re: Qt и WINAPi
Отправлено: kambala от Март 02, 2016, 18:23
а каким боком тут Qt? да и QtCreator — всего лишь среда разработки.

может ты тут используешь какой-то другой компилятор? (например, MinGW)


Название: Re: Qt и WINAPi
Отправлено: Racheengel от Март 02, 2016, 18:42
Скорее всего FindFileData.cFileName распознается как поинтер на строку (0x28fc78).

А если заменить на

std::cout << std::wstring(FindFileData.cFileName) << "   "<<FindFileData.nFileSizeLow<<std::endl;

то должно по идее заработать.


Название: Re: Qt и WINAPi
Отправлено: 4ippers от Март 02, 2016, 18:46
kambala, да, вы правы. Но это никак не решило проблемы


Название: Re: Qt и WINAPi
Отправлено: 4ippers от Март 02, 2016, 18:50
Racheengel, попробовал вышла ошибка:
cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>


Название: Re: Qt Creator(MiniGW) и WINAPi
Отправлено: VPS от Март 02, 2016, 19:58
Попробуйте так:
Код
C++ (Qt)
std::wcout << FindFileData.cFileName << "   "<<FindFileData.nFileSizeLow<<std::endl;


Название: Re: Qt Creator(MiniGW) и WINAPi
Отправлено: 4ippers от Март 02, 2016, 20:08
vps, спасибо, помогло. Но интересно, почему так было, хм)


Название: Re: Qt Creator(MiniGW) и WINAPi
Отправлено: 4ippers от Март 02, 2016, 20:15
Могли бы пожалуйста еще подсказать одну вещь. Некоторые названия, очень длинные. Можно ли как-то выводить определенное кл-во символ? (например выводить первые 6 букв названия файла?).


Название: Re: Qt Creator(MiniGW) и WINAPi
Отправлено: VPS от Март 02, 2016, 20:48
Могли бы пожалуйста еще подсказать одну вещь. Некоторые названия, очень длинные. Можно ли как-то выводить определенное кл-во символ? (например выводить первые 6 букв названия файла?).
Гугл в помощь (http://lmgtfy.com/?q=Is+there+a+way+to+specify+how+many+characters+of+a+string+to+print+out+using+printf()%3F)


Название: Re: Qt Creator(MiniGW) и WINAPi
Отправлено: 4ippers от Март 02, 2016, 20:57
vps, если бы это был string или char, то да. Но тут что-то другое


Название: Re: Qt Creator(MiniGW) и WINAPi
Отправлено: VPS от Март 02, 2016, 22:32
Попробуйте так (только не оптимально это):
Код:
const short STRING_LENGTH = 3;
std::wstring fileName(FindFileData.cFileName);
std::wcout << fileName.substr(0, STRING_LENGTH) << "   "<<FindFileData.nFileSizeLow<<std::endl;


Название: Re: Qt Creator(MiniGW) и WINAPi
Отправлено: VPS от Март 03, 2016, 14:13
Небольшое изменение, с использованием функции форматированного вывода:
Код
C++ (Qt)
#include "windows.h"
#include <tchar.h>
 
int main()
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hf;
 
  hf = FindFirstFile(TEXT("C:\\*"), &FindFileData);
  if(hf != INVALID_HANDLE_VALUE)
  {
     do
     {
        //limiting the output to 10 characters
        _tprintf(TEXT("%.10ls\t%d\n"), FindFileData.cFileName, FindFileData.nFileSizeLow);
     }
     while(FindNextFile(hf,&FindFileData) != 0);
     FindClose(hf);
  }
 
  return 0;
}
 
В pro файле для использования UNICODE надо добавить: DEFINES += _UNICODE

P/S: здесь  (https://habrahabr.ru/post/164193/)можно почитать про TCHAR, WCHAR и т.п.