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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LPTSTR и strcat(), несуразица 
:(
    Опции темы
Madest
Дата 27.5.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код
CString sq;
LPTSTR lp=new char[80];

lp="c:\\";
sq.Format("1- %s",lp);
AfxMessageBox(sq);

lp="c:\\ZEZO\\p";
sq.Format("2- %s",lp);
AfxMessageBox(sq);

strcat(lp,"1");
sq.Format("3- %s",lp);
AfxMessageBox(sq);

Когда программа первый раз исполняет этот код, выдается:
    1- с:\
    2- c:\ZEZO\p
    3- c:\ZEZO\p1
Если не выходя из программы обратиться к этому коду еще раз, то выдает:
    1- с:\
    2- c:\ZEZO\p1
    3- c:\ZEZO\p11
Почему, когда я в части 2 присваиваю lp="c:\\ZEZO\\p"; lp получается с единичкой на конце?! Ведь присваивается нормально ей в части 1 "c:\\". Догадываюсь, что виной тому strcat(). А чего же делать?

Это сообщение отредактировал(а) Madest - 27.5.2004, 20:05
--------------------
PM MAIL   Вверх
kruchinin
Дата 27.5.2004, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



strcat здесь не причем (и вообще есть APi-шные функции для работы в Windows - lstrcat)
попробуй не присваивать
Код

lp="c:\\ZEZO\\p";

а везде делать
Код

lstrcpy(lp,"c:\\ZEZO\\p");

или strcpy - просто зачем подключать еще одну библиотеку если при работе с Win приложением у тебя автоматически есть та функция
PM MAIL   Вверх
Madest
Дата 27.5.2004, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если так:
Код
lstrcpy(lp,"c:\\ZEZO\\p");
strcat(lp,"1");

то тогда при передаче lp в
Код
SHFILEOPSTRUCT sh;
...
sh.pFrom=lp;
...
SHFileOperation(&sh);

это не работает =(

Это сообщение отредактировал(а) Madest - 27.5.2004, 19:57
--------------------
PM MAIL   Вверх
Baa
Дата 27.5.2004, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Только так smile.gif При твоем варианте ты вообще не понятно зачем выделяешь память.
Видимо не совсем понимаешь, что есть указатель.
Ты сначала зарезервировал 80 байт.
На них указывает твой указатель, а потом ты взял и поменял ему место, на которое он указывает, на адрес, где записан твой "c:\\"
соотв. дальше ты делаешь примерно тоже самое, а в конце вообще кульминация.
Ты дописываешь 1 в память, где была записана та константа, затирая то, что после неё.
Код

CString sq;
LPTSTR lp = new TCHAR [80];

lstrcpy (lp, "c:\\");
sq.Format("1- %s",lp);
AfxMessageBox(sq);

lstrcpy(lp, "c:\\ZEZO\\p");
sq.Format("2- %s",lp);
AfxMessageBox(sq);

lstrcat(lp,"1");
sq.Format("3- %s",lp);
AfxMessageBox(sq);
delete [] lp;



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Madest
Дата 28.5.2004, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Эти мои изыскания от безысходности =)
Этот фрагмент, вообще, лишь для того, чтоб убедиться сам не знаю в чем:
Код
lp="c:\\";
sq.Format("1- %s",lp);
AfxMessageBox(sq);

В общем, цель удалить директорию с файлами. Взял из FAQ:
Код
SHFILEOPSTRUCT sh;
sh.hwnd=pFrame->m_hWnd;
sh.wFunc=FO_DELETE;
sh.pFrom="/*некий путь*/";
sh.pTo="NULL";
sh.fFlags=FOF_NOCONFIRMATION|FOF_SILENT;
sh.hNameMappings=0;
sh.lpszProgressTitle=NULL;
SHFileOperation(&sh);

А мне путь заранее неизвестен. Вот и пытаюсь:
Код
LPTSTR lp;
lp="c:\\ZEZO\\p";
strcat(lp,"допустим 1");

Так срабатывает, но только один раз.
А так ни разу:
Код
LPTSTR lp;
lstrcpy(lp,"c:\\ZEZO\\p");
lstrcat(lp,"1");

Пишет: "Не удается удалить файл. Не удается произвести чтение из файла или с диска."
Что же делать?!
--------------------
PM MAIL   Вверх
AndyY
Дата 28.5.2004, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нужно так:
char sz[MAX_PATH];
strcpy( sz, "c:\\zero\\" );
strcat( sz, 1 );

ну или через new, malloc распределить память.

а то ты пытаешься менять область памяти со статическими данными.

а вообще хороший стиль - пользоваться функциями _tcs* (например, _tcscpy)
еще лучше - с проверкой длинны строк (_tcsncpy)


--------------------
PM MAIL WWW   Вверх
Madest
Дата 28.5.2004, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как все просто =) Перемудрил =)
Спасибо!
--------------------
PM MAIL   Вверх
Shootnik
Дата 1.10.2008, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

            char sz[100];
            strcpy( sz, "\\Temp\\Пробник\0" );//strcpy( sz, nameOfDirectory );
            SHFILEOPSTRUCT sh;
            sh.hwnd   = GetSafeHwnd(); 
            sh.wFunc  = FO_DELETE;
            sh.pFrom  = sz;
            sh.pTo    = NULL;
            sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
            sh.hNameMappings = 0;
            sh.lpszProgressTitle = NULL;
            SHFileOperation (&sh);

Выдает такую же ошибку, как и у Madest'а. nameOfDirectory - имя папки, которую нужно удалить. Насколько я понял, здесь что-то с преобразованием char* в const char*. Но как это исправить. Буду очень благодарен, если напишите конкретный пример, так как моих знаний на понятия общих объяснений может не хватить. Заранее спасибо.

Это сообщение отредактировал(а) Shootnik - 1.10.2008, 01:49
PM MAIL ICQ   Вверх
J0ker
Дата 1.10.2008, 03:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Shootnik @  1.10.2008,  01:38 Найти цитируемый пост)
strcpy( sz, "\\Temp\\Пробник\0" );


чо это за \0 у вас?


--------------------
user posted image
PM MAIL   Вверх
Shootnik
Дата 1.10.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(J0ker @  1.10.2008,  03:16 Найти цитируемый пост)
чо это за \0 у вас? 

Удаляет все вложенные папки и файлы, включая "Пробник" - это не суть важно, можно и без этого обойтись. Здесь точно проблема не в этом...
PM MAIL ICQ   Вверх
J0ker
Дата 1.10.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Shootnik @ 1.10.2008,  10:22)
Цитата(J0ker @  1.10.2008,  03:16 Найти цитируемый пост)
чо это за \0 у вас? 

Удаляет все вложенные папки и файлы, включая "Пробник" - это не суть важно, можно и без этого обойтись. Здесь точно проблема не в этом...

я просто подумал возможно вы хотели написать "\\Temp\\Пробник\\0" и "0" - часть имени...


--------------------
user posted image
PM MAIL   Вверх
xvr
Дата 1.10.2008, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Shootnik @ 1.10.2008,  01:38)
Код

            char sz[100];
            strcpy( sz, "\\Temp\\Пробник\0" );//strcpy( sz, nameOfDirectory );
            SHFILEOPSTRUCT sh;
            sh.hwnd   = GetSafeHwnd(); 
            sh.wFunc  = FO_DELETE;
            sh.pFrom  = sz;
            sh.pTo    = NULL;
            sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
            sh.hNameMappings = 0;
            sh.lpszProgressTitle = NULL;
            SHFileOperation (&sh);

Выдает такую же ошибку, как и у Madest'а. nameOfDirectory - имя папки, которую нужно удалить. Насколько я понял, здесь что-то с преобразованием char* в const char*. Но как это исправить. Буду очень благодарен, если напишите конкретный пример, так как моих знаний на понятия общих объяснений может не хватить. Заранее спасибо.

Цитата

pFrom
Address of a buffer to specify one or more source file names. These names must be fully qualified paths. Standard Microsoft® MS-DOS® wild cards, such as "*", are permitted in the file-name position. Although this member is declared as a null-terminated string, it is used as a buffer to hold multiple file names. Each file name must be terminated by a single NULL character. An additional NULL character must be appended to the end of the final name to indicate the end of pFrom.
Судя по \0 в strcpy( sz, "\\Temp\\Пробник\0" ) такое намеренье было, но вся проблема в том, что strcpy не скопирует лишний 0  smile Так что напиши просто
Код

sh.pFrom  = "\\Temp\\Пробник\0";


PM MAIL   Вверх
Shootnik
Дата 1.10.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если писать так
Код

            SHFILEOPSTRUCT sh;
            sh.hwnd   = GetSafeHwnd(); 
            sh.wFunc  = FO_DELETE;
            sh.pFrom  =" \\Temp\\Пробник";
            sh.pTo    = NULL;
            sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
            sh.hNameMappings = 0;
            sh.lpszProgressTitle = NULL;
            SHFileOperation (&sh);

то все работает, но если имя папки, которую нужно удалить не фиксировано, т.е.
Код

            char sz[100];
            strcpy( sz, "\\Temp\\Пробник" );
            SHFILEOPSTRUCT sh;
            sh.hwnd   = GetSafeHwnd(); 
            sh.wFunc  = FO_DELETE;
            sh.pFrom  = sz;
            sh.pTo    = NULL;
            sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
            sh.hNameMappings = 0;
            sh.lpszProgressTitle = NULL;
            SHFileOperation (&sh);

то выдается ошибка.
PM MAIL ICQ   Вверх
J0ker
Дата 1.10.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Shootnik @  1.10.2008,  18:48 Найти цитируемый пост)
то выдается ошибка. 

Код

pFrom
Note  This string must be double-null terminated.

(уродство какое-то  smile )
Код

char sz[100];
memcpy( sz, "\\Temp\\Пробник\0", strlen("\\Temp\\Пробник")+2 );



Это сообщение отредактировал(а) J0ker - 1.10.2008, 19:23


--------------------
user posted image
PM MAIL   Вверх
Shootnik
Дата 1.10.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

                        char sz[100];
                        memcpy( sz, "\\Temp\\Пробник\0", strlen("\\Temp\\Пробник")+2 );
            SHFILEOPSTRUCT sh;
            sh.hwnd   = GetSafeHwnd(); 
            sh.wFunc  = FO_DELETE;
            sh.pFrom  = sz;
            sh.pTo    = NULL;
            sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
            sh.hNameMappings = 0;
            sh.lpszProgressTitle = NULL;
            SHFileOperation (&sh);

и...
ошибка то осталась, тем более если заменить "\\Temp\\Пробник\0" на какую-нибудь другую строку
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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