Russian Qt Forum
Ноябрь 25, 2024, 03:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt Creator(MiniGW) и WINAPi  (Прочитано 6042 раз)
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, тот же самый код нормально обрабатывает, что делать?
Результат во вложение
« Последнее редактирование: Март 02, 2016, 18:53 от 4ippers » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 02, 2016, 18:23 »

а каким боком тут Qt? да и QtCreator — всего лишь среда разработки.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Март 02, 2016, 18:42 »

Скорее всего FindFileData.cFileName распознается как поинтер на строку (0x28fc78).

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

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
4ippers
Гость
« Ответ #3 : Март 02, 2016, 18:46 »

kambala, да, вы правы. Но это никак не решило проблемы
Записан
4ippers
Гость
« Ответ #4 : Март 02, 2016, 18:50 »

Racheengel, попробовал вышла ошибка:
cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>
Записан
VPS
Гость
« Ответ #5 : Март 02, 2016, 19:58 »

Попробуйте так:
Код
C++ (Qt)
std::wcout << FindFileData.cFileName << "   "<<FindFileData.nFileSizeLow<<std::endl;
Записан
4ippers
Гость
« Ответ #6 : Март 02, 2016, 20:08 »

vps, спасибо, помогло. Но интересно, почему так было, хм)
Записан
4ippers
Гость
« Ответ #7 : Март 02, 2016, 20:15 »

Могли бы пожалуйста еще подсказать одну вещь. Некоторые названия, очень длинные. Можно ли как-то выводить определенное кл-во символ? (например выводить первые 6 букв названия файла?).
Записан
VPS
Гость
« Ответ #8 : Март 02, 2016, 20:48 »

Могли бы пожалуйста еще подсказать одну вещь. Некоторые названия, очень длинные. Можно ли как-то выводить определенное кл-во символ? (например выводить первые 6 букв названия файла?).
Гугл в помощь
« Последнее редактирование: Март 02, 2016, 20:55 от vps » Записан
4ippers
Гость
« Ответ #9 : Март 02, 2016, 20:57 »

vps, если бы это был string или char, то да. Но тут что-то другое
Записан
VPS
Гость
« Ответ #10 : Март 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;
Записан
VPS
Гость
« Ответ #11 : Март 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: здесь можно почитать про TCHAR, WCHAR и т.п.
« Последнее редактирование: Март 03, 2016, 14:16 от vps » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.258 секунд. Запросов: 22.