Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не работает NULL? 
:(
    Опции темы
satellite
Дата 8.12.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Открываю файл, получаю буфер с названиями файлов:

CFileDialog Dialog(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT);
    Dialog.m_ofn.nMaxFile = 100;
    Dialog.m_ofn.lpstrFile = FullName.GetBuffer(100);     //FullName типа CString
    Dialog.DoModal();
                FullName.ReleaseBuffer();

В FullName по идее строка с именами файлов, разделенными NULL. Пытаюсь вставить вместо NULL перевод строки:

         for (int i = 1; i <FullName.GetLength(); i++) //цикл с 1 до длины FullName
                {
        buffer = FullName.GetAt(i);                            //buffer типа CString, получение символа
        if ( buffer == NULL) FullName.SetAt (i, '\n');   //сравнение символа с NULL
    }

компилируется без проблем, но после запуска программа прерывается и 
выскакивает ошибка, и именно из-за NULL как я понял.
Что я неправильно делаю? Я начинающий, поэтому заранее прошу простить если туплю )))
PM MAIL   Вверх
Romikgy
Дата 8.12.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(satellite @  8.12.2006,  11:26 Найти цитируемый пост)
В FullName по идее строка с именами файлов, разделенными NULL

разве? а не разделены они переводом строк?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Earnest
Дата 8.12.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Чем ковыряться в возврщанной строке, проще использовать функции CFileDialog::GetStartPosition и GetNextPathName


--------------------
...
PM   Вверх
satellite
Дата 8.12.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Earnest @ 8.12.2006,  15:27)
Чем ковыряться в возврщанной строке, проще использовать функции CFileDialog::GetStartPosition и GetNextPathName


Эти методы возвращают полный путь каждого выбранного файла, а мне нужны именно названия файлов. Каким образом выцепить из полного пути имя файла?

Добавлено @ 19:59 
Цитата(Romikgy @ 8.12.2006,  12:32)
Цитата(satellite @  8.12.2006,  11:26 Найти цитируемый пост)
В FullName по идее строка с именами файлов, разделенными NULL

разве? а не разделены они переводом строк?

Выдержка из MSDN:
For Explorer-style dialog boxes, the directory and file name strings are NULL separated, with an extra NULL character after the last file name. For old-style dialog boxes, the strings are space separated

Разделены NULL' ем )))
PM MAIL   Вверх
Romikgy
Дата 8.12.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(satellite @  8.12.2006,  18:56 Найти цитируемый пост)
Каким образом выцепить из полного пути имя файла?

Код

char * ExtractFilePath(const char *Name)
{
 int i = strlen(Name);
 
 while ((i > 0)&&(Name[i] != '\\')) i--;
 if (i)
 {
   return (char *)(Name+i+1);
 }
 return (char*)0;
}
 имхо


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
satellite
Дата 9.12.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо ребята, придется сделать именно так, но все-таки вопрос с NULL остается открытым ))
PM MAIL   Вверх
Fin
Дата 9.12.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


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

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



satellite, У тебя buffer как определен?
Если что то типа char *buffer то строчка  if ( buffer == NULL)  будет проверять на что указывает указатель buffer.  Если так char buffer[], то условие вообше не должно выполняться. 

Да там получается массив строк, разделенных между собой 0. Конец массива указан двумя нулями. 


--------------------
Пролетал мимо.
PM MAIL   Вверх
satellite
Дата 9.12.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to Fin

buffer определен как CString, и в нем после работы диалога находится строка, я проверял, вот только разделена она, если смотреть в текстовом режиме  - квадратиками )) ...
PM MAIL   Вверх
Fin
Дата 9.12.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


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

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



satellite, Эээ символ с кодом 0 не имеет графического представления. Поэтому у тебя будут идти квадратики. Хотя я не совсем понял про текстовый режим. Это как?

Кстати NULL помоему в windows.h определен так
Код

#define NULL 0


И при твоем определении 
Код

CString buffer;

Такое сравнение 
Код

 if ( buffer == NULL) FullName.SetAt (i, '\n');   //сравнение символа с NULL

не корректно и не будет работать.


--------------------
Пролетал мимо.
PM MAIL   Вверх
satellite
Дата 10.12.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Текстовым режимом я назвал вот что ))) я записал содержимое buffer в текстовый файл с помощью WRITE примерно так:
      CFile MyFile;
      MyFile.Write(buffer, buffer.GetLength()); 

После этого в текстовом файле оказались имена файлов, разделенные именно квадратиками )))
Т.е. в buffer находится имеено то, что мне надо, но только я не могу оттуда это достать )))

Кстати, насчет использования GetStartPosition() и GetNextPathName(pos).
я написал функцию, которая выделяла имена файлов из полного пути,все вроде бы получилось отлично, но..... При попытке выделить большое количество файлов эти методы работать отказываются,
вот так. Поэтому придется все-таки через буфер так как его емкость можно увеличить с помощью m_ofn.nMaxFile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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