Форум программистов, компьютерный форум CyberForum.ru

WIN32_FIND_DATA - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
17.09.2013, 12:38     WIN32_FIND_DATA #1
Всем доброго дня! Помогите понять почему имя найденного файла выводится закорючками ? хочу проверить найден файл или нет, все ли правильно сделано ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <windows.h>
#include <typeinfo> // для typeid()
using namespace std;
#include <process.h> // для exit()
//#include <winbase.h>
 
void main()
{
    setlocale( LC_ALL,"Russian" ); 
    WIN32_FIND_DATA sss;
        HANDLE f;
        f = FindFirstFile("E:\Sanni.txt", &sss);
 
    cout<<endl<<" cFileName "<<sss.cFileName;
    
    cout<<endl;
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2013, 12:38     WIN32_FIND_DATA
Посмотрите здесь:

C++ тип переменной WIN32_FIND_DATA
WIN32_FIND_DATA Вывод имени файла C++
C++ Тип переменной WIN32_FIND_DATA
В чем разница между структурами WIN32_FIND_DATA LPWIN32_FIND_DATA LPWIN32_FIND_DATAA WIN32_FIND_DATAA C++ WinAPI

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
17.09.2013, 12:46     WIN32_FIND_DATA #2
Почитайте для начала здесь: Русские шрифты в консоли
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.09.2013, 12:47     WIN32_FIND_DATA #3
Обратный слеш нужно двойным делать.

Добавлено через 42 секунды
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Почитайте для начала здесь
Вывод у него сделан.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
17.09.2013, 13:27  [ТС]     WIN32_FIND_DATA #4
Перед компиляцией выложенного кода, в настройке проекта указал использование многобайтовой кодировки. Сейчас изменил настройку на использование символов юникода и изменил строку:
C++
1
    f = FindFirstFile("E:\Sanni.txt", &sss);
на
C++
1
    f = FindFirstFile([B]L[/B]"E:\Sanni.txt", &sss);
Теперь в консоли выводится 32 разрядный адрес в шестнадцатеричном представлении.

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Обратный слеш нужно двойным делать.
Обратный сплеш не помог, все равно адрес

Добавлено через 7 минут
Цитата Сообщение от ArkTaS Посмотреть сообщение
Обратный сплеш не помог, все равно адрес
Вернул обратно многобайтовую кодировку и все правильно выводит) спасибо! А что бы на настройке с юникодом заработало нужно было ANSI версии функций и структуры юзать FindFirstFileA и WIN32_FIND_DATAA.
Вопрос, читал что есть макросы для почти всех объявлений сущностей в с++ с префиксом _T которые автоматически выбирают подходящее объявление в зависимости от настройки символов. Эти макросы нужно самому писать или они в какой то библиотеке ? Так как добавляю префикс _T для FindFirstFile и WIN32_FIND_DATA а компилятор не видит ..
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.09.2013, 13:28     WIN32_FIND_DATA #5
Цитата Сообщение от ArkTaS Посмотреть сообщение
Обратный сплеш не помог,
И тем не менее, нужно правильно писать.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
17.09.2013, 13:29     WIN32_FIND_DATA #6
Выводи только при условии, если данные найдены.
C++
1
2
if (f != INVALID_HANDLE_VALUE)
...
И не забудь закрыть после завершения.
C++
1
FindClose(f);
Добавлено через 1 минуту
Цитата Сообщение от ArkTaS Посмотреть сообщение
Вопрос, читал что есть макросы для почти всех объявлений сущностей в в с++ с префиксом _T которые автоматически выбирают подходящее объявление в зависимости от настройки символов. Эти макросы нужно самому писать или они в какой то библиотеке ? Так как добавляю префикс _T для FindFirstFile и WIN32_FIND_DATA а компилятор не видит ..
C++
1
#include <tchar.h>
вроде
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.09.2013, 13:31     WIN32_FIND_DATA #7
У меня, код из первого поста (с двойным обратным слешем), работает при не заданном, в свойствах проекта, наборе символов (10 студия).
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
17.09.2013, 13:37  [ТС]     WIN32_FIND_DATA #8
Почему тогда не работает этот вариант при настройках юникода. Если функции по умолчании получают и возвращают wchar символы, можно добавить FindFirstFileW и WIN32_FIND_DATAW но все равно выводит адрес. Помогите заставить работать юникодовскую версию функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{
    setlocale( LC_ALL,"Russian" ); 
    WIN32_FIND_DATA sss;
    HANDLE f;
    f = FindFirstFile(L"E:\\Sanni.txt", &sss);
 
    cout<<endl<<" dwFileAttributes "<<sss.cFileName;
    
    cout<<endl;
    system("pause");
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.09.2013, 13:40     WIN32_FIND_DATA #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void main()
{
    setlocale( LC_ALL,"Russian" ); 
    
    WIN32_FIND_DATAW sss;
    HANDLE f;
    f = FindFirstFileW(L"E:\\Sanni.txt", &sss);
 
    wcout << endl << L" cFileName " << sss.cFileName;
    
    cout << endl;
    system("pause");
}
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
17.09.2013, 13:41  [ТС]     WIN32_FIND_DATA #10
alsav22, У меня 2012 студия. изначально в настройках по умолчанию стояли символы юникода и 1-й аргумент ф-и FindFirstFile("E:\\Sanni.txt", &sss); без префикса L не катит компилятор пишет const char* несовместим с LPCWSTR
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.09.2013, 13:44     WIN32_FIND_DATA #11
Цитата Сообщение от ArkTaS Посмотреть сообщение
alsav22, У меня 2012 студия. изначально в настройках по умолчанию стояли символы юникода и 1-й аргумент ф-и FindFirstFile("E:\\Sanni.txt", &sss); без префикса L не катит компилятор пишет const char* несовместим с LPCWSTR
Это понятно. Я к тому, что всё можно устанавливать.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
17.09.2013, 13:57     WIN32_FIND_DATA #12
Цитата Сообщение от ArkTaS Посмотреть сообщение
alsav22, У меня 2012 студия. изначально в настройках по умолчанию стояли символы юникода и 1-й аргумент ф-и FindFirstFile("E:\\Sanni.txt", &sss); без префикса L не катит компилятор пишет const char* несовместим с LPCWSTR
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <Windows.h>
 
int main()
  {
  setlocale( LC_ALL,"Russian" ); 
  WIN32_FIND_DATA find_data;
  HANDLE hfind;
  std::string filename ("C:\\windows");
  hfind = FindFirstFile (filename.c_str(), &find_data);
  if (hfind != INVALID_HANDLE_VALUE)
    std::wcout << L"dwFileAttributes "<< find_data.cFileName;
  else
    std::wcout << L"File not found";
  FindClose(hfind);
  std::wcout<<std::endl;
  system("pause");
  return 0;
  }
Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <Windows.h>
 
int main()
  {
  setlocale( LC_ALL,"Russian" ); 
  WIN32_FIND_DATAW find_data;
  HANDLE hfind;
  std::wstring filename (L"C:\\windows");
  hfind = FindFirstFileW (filename.c_str(), &find_data);
  if (hfind != INVALID_HANDLE_VALUE)
    std::wcout << L"dwFileAttributes "<< find_data.cFileName;
  else
    std::wcout << L"File not found";
  FindClose(hfind);
  std::wcout<<std::endl;
  system("pause");
  return 0;
  }
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
17.09.2013, 14:30  [ТС]     WIN32_FIND_DATA #13
alsav22, Спасибо, забыл про wcout, раньше никогда не приходилось его использовать. Добавлю что бы все стало на свои места если навести на WIN32_FIND_DATA то студия покажет что WIN32_FIND_DATA и WIN32_FIND_DATAW синонимы так как #typedef WIN32_FIND_DATA WIN32_FIND_DATAW. Значит не существует другого определения для структуры только с широкими символами.
А FindFirstFile это макрос. Реальные имена это FindFirstFileA для АНСИ и FindFirstFileW для юникода. И по умолчанию FindFirstFile воспринимается как FindFirstFileW т.к #define FindFirstFile FindFirstFileW. Мне кажется что макросы для каждой функции находятся в заголовке с ее объявлением, получается где то в дебрях windows.h )

Добавлено через 9 минут
Nekto, Это что для любой апи возвращающей указатель на воид нужно вызывать функцию очистки памяти ? А где их имена можно посмотреть ?

Добавлено через 4 минуты
Зачем вообще эти макросы для объявлений функций с разными типами, почему не использовали шаблон ?
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
17.09.2013, 15:18     WIN32_FIND_DATA #14
Цитата Сообщение от ArkTaS Посмотреть сообщение
Зачем вообще эти макросы для объявлений функций с разными типами, почему не использовали шаблон ?
дак чтобы лишнего кода не было, так как проект либо UNICODE либо нет, две реализации держать незачем
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
17.09.2013, 16:02     WIN32_FIND_DATA #15
Цитата Сообщение от ArkTaS Посмотреть сообщение
Зачем вообще эти макросы для объявлений функций с разными типами, почему не использовали шаблон ?
Win32 API - это С-интерфейс, в С шаблонов нет.
Yandex
Объявления
17.09.2013, 16:02     WIN32_FIND_DATA
Ответ Создать тему
Опции темы

Текущее время: 21:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru