|
Модераторы: bsa |
|
EttoreMajorana |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.5.2017 Репутация: нет Всего: нет |
Доброго дня, уважаемые форумчане!
Пытаюсь использовать функции findfirstfile и findnextfile для поиска файла. Первым параметром оно хочет TCHAR, а у меня три переменные строковые с содержимым "C:", "ProgramData" и "settings.ini". Я их склеиваю, но как их преобразовать в TCHAR? И как потом этот TCHAR обратно в обычную строку преобразовать? Нахрена такие танцы с миллионом типов данных? Есть ли простые функции для работы с TCHAR? Та же конкатенация, к примеру? Что за бред? Чтоб начать просто пользоваться функцией, надо ещё применить десяток непонятных технологий! |
|||
|
||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
EttoreMajorana |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.5.2017 Репутация: нет Всего: нет |
Да, спасибо! Именно на эту статью я набрёл самостоятельно. Но мне всё-равно непонятно, почему довольно-таки умный компилятор не переваривает конструкцию типа:
P.S.: Только вкатываюсь в С++ и немного шокирован происходящим. Как бы то ни было строки и в Африке строки, но только не в С++!!! Тут если ты работаешь с файловой системой, то строки у тебя TCHAR, если работаешь с сетью, то строки у тебя WCHAR, строки в старых учебниках и у студентов в лабах - это массивы символов, строки в новых учебниках - это классы, классы, классы... И всё это живёт своей жизнью! И меж собой никак не соотносится. Вообще никак! Пока очень сложно увидеть в этом хоть какую-нибудь систематику. Да и логика, если по честному, странная тут. Это вообще не похоже на язык высокого уровня. Это гипертрофированный ассемблер на стероидах! P.P.S.: Теперь становится понятно, почему софт написанный на С++ настолько уязвим и потенциально изобилует ошибками. Этот инструмент реально позволяет "выстрелить себе в ногу"! Это сообщение отредактировал(а) EttoreMajorana - 26.5.2017, 19:59 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Для начала нужно уяснить, что в 'голом' С (и С++ тоже) строк нет вообще. Есть только массивы символов, причем фиксированной длинны. Поэтому ваш strcat("C:\\", win.cFileName) гарантированно работать не будет вообще. И никакой TCHAR вам не поможет.
Как все запущенно char'ов в С/С++ всего 2 - это char и wchar_t, все остальное это рукоблудие MS и писателей библиотек (даже с учетом того, что библиотеки ныне внесены в стандарт) Когда стало понятно, что со строками в языке совсем беда, в С++ были сделаны (в библиотеке) классы, которые позволили бы работать с нормальными строками - это std::string (ну и std::wstring). В С такой номер не прошел, так что там до сих пор воюют с ними руками. TCHAR (с сотоварищами) появился тогда, когда до MS дошло, что в мире существует не только Английский язык, но еще много других. В том числе такие, что никак в char не умещались. Раньше MS это поняли в Unicode Consortium и был разработан char пошире, что бы туда уже все влезло. В компиляторах это появилось сильно позже, в виде типа wchar_t. Windows NT уже использовала для всех внутренних строк именно широкую Unicode кодировку. Но тут стал вопрос - что делать с массой кода на С и С++ который был написан ДО того, и в который никто никакой Unicode не вставлял? И как он будет общаться с системными вызовами, которые теперь хотят Unicode? И что делать тем, кто хочет иметь возможность жить и по старому (с char) и по новому (c Unicode) одновременно? Вот тут и появился TCHAR и все остальные t*. В зависимости от режима компиляции (он выбирается в свойствах проекта) он становится или char или wchar_t. Все функции WIN32 API так же меняют принимаемые строки параметры в зависимости от типа компиляции - или строки в старых (8ми битных символах) или строки в Unicode. Таким образом, достаточно сменить настройку проекта и старое приложение волшебным образом меняется в новое - Unicode. К сожалению реальность подкачала, и при смене настройки обычно старое приложение превращается в свежий труп, который отказывается даже компилиться А если учесть, что при создании проекта в VS этот самый Unicode режим по умолчанию включен, то возникает масса проблем. И пытаться решить их приведением char* в TCHAR* сродни попытке реанимации трупа. Ну его так и создавали. Хотите чего нибудь более высокоуровнево - берите Java или C# Это сообщение отредактировал(а) xvr - 26.5.2017, 22:36 |
|||
|
||||
volatile |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Да чел явно тролит. Очередной "критик С/С++", второй день как перешедший с какого-нибудь Java, и решивший что он имеет моральное право критиковать.
|
|||
|
||||
EttoreMajorana |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.5.2017 Репутация: нет Всего: нет |
xvr, спасибо за разъяснения! Потихоньку осваиваюсь с С++. И таки да! Я старый троль второй день как перешедший с какого-нибудь Java или ещё с чего-нибудь. Ну а собственно, почему бы и нет? Кто запрещает то? Критиковать и в мыслях не было, потому как я стараюсь не тратить своё и чужое время на это. Но, пардон муа, у любого второй день как перешедшего с какого-нибудь Java обязательно возникнет вопрос, почему по логике вещей конструкция типа:
нихрена не работает на С++. Более того, работа со строками в С++ довольно таки нетривиальная весчь!!! Что-бы убедиться в моих словах, достаточно загуглить запрос типа "конкатенация TCHAR". |
|||
|
||||
volatile |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
EttoreMajorana |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.5.2017 Репутация: нет Всего: нет |
Почти разобрался. Осталась одна непонятка!
Имеем:
Далее по ходу программы имеем кусок:
После отработки функций path содержит то что нужно и с работой FindNextFile проблем не возникает. Т. е. я добился чего хотел. Но есть одно но!!! После отработки функции wcscat указатели buff и path содержат один и тот же адрес!!! Как так? Ведь хочется временный буфер и далее пользовать как временный буфер! |
||||
|
|||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Если хочется временный буфер, то вам его придется сделать самому, увы. С и С++ не занимается за программиста вопросами распределения памяти, все руками Или используйте стандартную библиотека - std::string & std::wstring. Ее для того и сделали |
|||
|
||||
EttoreMajorana |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.5.2017 Репутация: нет Всего: нет |
Мне уже начинает нравиться этот язык! Он как ассемблер ZX Spectrum! Можно сделать всё, если только знаешь как! Вот только боюсь что на это "знаешь как" могут годы уйти! Извините за оффтоп.
|
|||
|
||||
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |