Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование элемента структуры, копируется только 1 символ 
V
    Опции темы
Promosoft
  Дата 31.5.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Есть WIN32_FIND_DATA структура с именем FindFileData:
Код
typedef struct _WIN32_FIND_DATA {
  DWORD     dwFileAttributes; 
  FILETIME  ftCreationTime; 
  FILETIME  ftLastAccessTime; 
  FILETIME  ftLastWriteTime; 
  DWORD     nFileSizeHigh; 
  DWORD     nFileSizeLow; 
  DWORD     dwReserved0; 
  DWORD     dwReserved1; 
  TCHAR     cFileName[ MAX_PATH ]; 
  TCHAR     cAlternateFileName[ 14 ]; 
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;  

Пытаюсь вытащить имя файла, которое хранится в  FindFileData.cFileName
Код
char cFileName[MAX_PATH];
sprintf(cFileName, "%s", FindFileData.cFileName);
или 
strcpy(cFileName, (char*)FindFileData.cFileName);
Но при это копируется всегда только первый символ.

При
Код
StringCbCopyN((LPTSTR)cFileName, sizeof(cFileName), (LPCTSTR)FindFileData.cFileName, sizeof(FindFileData.cFileName));

В cFileName копируется имя файла (в данном случае 123.txt), но между символами стоит нулевой код. Выглядит в отладчике так:
Код
- cFileName    0x0012fadc "1"    char [260]
[0]    49 '1'    char
[1]    0    char
[2]    50 '2'    char
[3]    0    char
[4]    51 '3'    char
[5]    0    char
[6]    46 '.'    char
[7]    0    char
[8]    116 't'    char
[9]    0    char
[10]    120 'x'    char
[11]    0    char
[12]    116 't'    char
[13]    0    char
[14]    0    char
[15]    0    char
[16]    -52 'М'    char
[17]    -52 'М'    char
...


Подскажите как правильно вытащить из структуры имя файла FindFileData.cFileName
PM MAIL   Вверх
azesmcar
Дата 31.5.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Promosoft

TCHAR     cFileName
это вам ни о чем не говорит?

Код

typedef wchar_t     TCHAR;

wchar_t хранит юникодные символы, занимает он больше одного байта, но...поскольку для ascii достаточно одного байта, в следующем(их) (смотря где как) байте хранится ноль. Следовательно натыкаясь на ноль strcpy останавливается.

Посмотрите функцию wcscpy.

Это сообщение отредактировал(а) azesmcar - 31.5.2009, 12:02
PM   Вверх
Alexeis
Дата 31.5.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(azesmcar @  31.5.2009,  10:58 Найти цитируемый пост)
Посмотрите функцию wcscpy.

  или на swprintf соответственно.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Promosoft
Дата 31.5.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



azesmcar, спасибо.

Помогла
Код
TCHAR cFileName[MAX_PATH];
wcscpy(cFileName, (TCHAR *)FindFileData.cFileName);



Это сообщение отредактировал(а) Promosoft - 31.5.2009, 12:43
PM MAIL   Вверх
andrew_121
Дата 31.5.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Promosoft, Пометьте тему решенной.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Rififi
Дата 31.5.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



TCHAR cFileName[MAX_PATH];
wcscpy(cFileName, (TCHAR *)FindFileData.cFileName);

мдэ. представляю, сколько радостных эпитетов пойдет в твой адрес от того, кому потом придётся отлаживать твой шЫдевр smile:
PM MAIL   Вверх
Promosoft
Дата 31.5.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Rififi, да у меня это большой вопрос, как бы вы вышли из положения?

Рядом возникла ещё одна проблема, вытащил из имени файла Расширение, аш 2-мя способами в тестовом проекте (программе), при встраивании в главную программы посыпались ошибки:

первый вариант:
Код
wchar_t *ext;

ext = wcsrchr(rgApplInfo.szAppName, '.')+1;
wsprintf(rgApplInfo.szAppExt, ext);

второй способ
_wmakepath + _wsplitpath

При первом способе не понятно почему ругается на неверный указатель и строчку ext = wcsrchr(rgApplInfo.szAppName, '.')+1;

Как бы вы вышли из положения?
PM MAIL   Вверх
586
Дата 31.5.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Код
#include <windows.h>
#include <tchar.h>
#include <stdio.h>


TCHAR *ext;
ext = _tcsrchr(rgApplInfo.szAppName, _T('.'));
if(ext == 0)
{
    // расширение не найдено
} else {
    //_stprintf(rgApplInfo.szAppExt, _T("%s"), ext+1);
    _tcscpy(rgApplInfo.szAppExt, ext+1);
}

Цитата
При первом способе не понятно почему ругается на неверный указатель и строчку ext = wcsrchr(rgApplInfo.szAppName, '.')+1;

Выложи определение rgApplInfo.szAppName.
PM   Вверх
Promosoft
Дата 31.5.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



586, Да это скромная структура для хранения информации о файле.

Код
typedef struct tagAPPLINFO
{
  TCHAR szAppName[_MAX_PATH];
  TCHAR szAppExt[_MAX_EXT];
  char szSize[20];
  char szWriteTime[16];
} APPLINFO;

Проблему с Расширением решил сам с 30 раза наверно как минимум, но мне не понравилось

Код
char *ext;
char Temp[MAX_PATH];
sprintf(Temp, "%s", rgApplInfo.szAppName);    // rgApplInfo.szAppName = readme.txt
ext = strrchr(Temp, '.')+1;
wsprintf(rgApplInfo.szAppExt, (LPCSTR)ext);

rgApplInfo.szAppExt - это уже место куда мне надо положить готовый "продукт".

Если кому то не лень потратить несколько минут, отругайте и укажите на ошибки с рекомендациями именно по этому куску кода smile

Это сообщение отредактировал(а) Promosoft - 31.5.2009, 21:55
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.