Подскажите аналоги LowerCase, Pos, ExtractFileExt в Visual C
От: Kill_of_Bill Украина www.tarnet.pisem.net
Дата: 09.03.03 16:58
Оценка:
т.е к примеру в Delphi есть токая строка:


if (Pos('htm', LowerCase(ExtractFileExt(SearchRec.Name))) <> 0) or (Pos('php', LowerCase(ExtractFileExt(SearchRec.Name))) <> 0) then
begin
...
end;


на Visual она будет такой:


if (!strcspn(_strlwr( _strdup(FileData.cFileName)), "htm") || !strcspn(_strlwr( _strdup(FileData.cFileName)), "php"))
{
...
}



Т.е аналог Pos в Visual это strcspn,
аналог LowerCase это связка _strlwr( _strdup(...)),


Аналога ExtractFileExt в Visual я не нашел. Подскажите если не облом.
Re: Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt в
От: promko Украина  
Дата: 09.03.03 17:58
Оценка: 3 (1)
"Kill_of_Bill" <forum@rsdn.ru> wrote in message news:210596@news.rsdn.ru...

ручками все надо делать:
szSource — твой cFileName
szDestination — куда записать результат

если не использовать СТЛ тогда можна написть следующий код
         
int nPos = strcspn(szSource, "." )+1; // to point on '.'
strncpy_from(szDestination, szSource, nPos, (strlen(szSource)+1)-nPos); // +1 - to save '\0'

где я написал свою функцию котораю умеет копировать не только начиная с первого символа как это делает strncpy (cм. параметр from):
 
char * __cdecl strncpy_from (
char * dest,
const char * source,
size_t from,
size_t count)
{
char *start = dest;
while (from && *source++)
;
while (count && (*dest++ = *source++)) /* copy string */
count--;
if (count) /* pad out with zeroes */
while (--count)
*dest++ = '\0';
return(start);
}

если использовать СТЛ что предпочтительние и короче то выйдет что такое:
string sSource("FileName.htm");
string sDestination;
sDestination.reserve(4);
int nPos = sSource.find(".")+1; 
if (nPos>0)
sDestination.assign(sSource.begin()+nPos, sSource.end());
Posted via RSDN NNTP Server 1.4.5
Re[2]: Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt
От: stuff Украина www.tarnet.pisem.net
Дата: 09.03.03 20:15
Оценка:
А как это буде выглядеть в виде функции:


char CModFileDlg::ExtractFileExt(const char* FileName)
{
  char *pdest;
  int result;

  /* Search backward. */
  pdest = strrchr( FileName, '.' );
  result = pdest - FileName + 1;
  if( pdest != NULL )
      //тут я не знаю как писать...
   else
    return '';
}


т.е функции ExtractFileExt сообщаем имя файла, а она нам возвращает расширение файла,
либо, если расширения нет то пустую строку.
Re[3]: Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt
От: Frostbitten Россия  
Дата: 09.03.03 20:41
Оценка: 2 (1)
Здравствуйте, stuff, Вы писали:

S>т.е функции ExtractFileExt сообщаем имя файла, а она нам возвращает расширение файла,

S>либо, если расширения нет то пустую строку.

Может все-таки подойдет

MSDN
+ Platform SDK
+ User Interface Services
+ Windows Shell
+ Shell Reference
+ Shell Lightweight Utility APIs
+ Path Functions

Там ::PathFindExtension, ::PathRemoveExtension, ::PathAddExtension и пр. Я понимаю они требуют много, но... они и в юникодовых компилях будут корректны.
Re[2]: Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt
От: stuff Украина www.tarnet.pisem.net
Дата: 09.03.03 21:12
Оценка:
Здравствуйте, promko, Вы писали:

А какая функция в C++ является аналогом function Copy(S; Index, Count: Integer): string;
Returns a substring of a string or a segment of a dynamic array.
Re[3]: Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt
От: promko Украина  
Дата: 09.03.03 21:52
Оценка:
Здравствуйте, stuff, Вы писали:

S>Здравствуйте, promko, Вы писали:


S>А какая функция в C++ является аналогом function Copy(S; Index, Count: Integer): string;

S>Returns a substring of a string or a segment of a dynamic array.
нету такой есть только
char *strncpy( char *strDest, const char *strSource, size_t count );

но у она не имеет праметра Index
повторюсь но чем не тебя устраивает написать свой аналог ?
 
char * __cdecl strncpy_from (char * dest,const char * source, size_t from, size_t count)
{
char *start = dest;
while (from && *source++)
    ;
while (count && (*dest++ = *source++)) /* copy string */
    count--;
if (count) /* pad out with zeroes */
    while (--count)
        *dest++ = '\0';
return(start);
}
Re[3]: Re: Re[2]: Re: Подскажите аналоги LowerCase, Pos, Ext
От: promko Украина  
Дата: 09.03.03 22:06
Оценка:
> т.е функции ExtractFileExt сообщаем имя файла, а она нам возвращает расширение файла,
> либо, если расширения нет то пустую строку.
если нужно откинуть расширение файла тогда пишем
(и тогда мы отделаемся только средствами библиотеки С++)
int nPos = strcspn(szSource, ".");
strncpy(szDestination, szSource, nPos);
szDestination[nPos]='\0';
Posted via RSDN NNTP Server 1.4.5
Re[4]: Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt
От: stuff Украина www.tarnet.pisem.net
Дата: 09.03.03 22:34
Оценка:
Здравствуйте, promko, Вы писали:


но чем не тебя устраивает написать свой аналог ?


если бы я досконально знал C++ я бы этим только и занимался.

Попытался, проверит предложенный вами пример:


  char *dest = "index.htm";
  char *source = "index.htm";

  AfxMessageBox(*strncpy_from(dest, source, 0, 3)); //должно напечатать "ind", происходит ошибка


Выдает ошибку. Что я сделал не так?
Re[4]: Re: Re[2]: Re: Подскажите аналоги LowerCase, Pos, Ext
От: stuff Украина www.tarnet.pisem.net
Дата: 09.03.03 22:44
Оценка:
Здравствуйте, promko, Вы писали:



>> т.е функции ExtractFileExt сообщаем имя файла, а она нам возвращает расширение файла,

>> либо, если расширения нет то пустую строку.
P>если нужно откинуть расширение файла тогда пишем
P>(и тогда мы отделаемся только средствами библиотеки С++)
P>
P>int nPos = strcspn(szSource, ".");
P>strncpy(szDestination, szSource, nPos);
P>szDestination[nPos]='\0';
P>



Реализация:

char *szSource = "index.htm";
char *szDestination;
    
int nPos = strcspn(szSource, ".");
strncpy(szDestination, szSource, nPos);  //вот здесь выдает ошибку!!!
szDestination[nPos]='\0';                //должны увидеть "htm" 

AfxMessageBox(szDestination);
Re[5]: Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt
От: promko Украина  
Дата: 09.03.03 23:06
Оценка: 3 (1)
Здравствуйте, stuff, Вы писали:

S>Попытался, проверит предложенный вами пример:

S>
S>  char *dest = "index.htm";
S>  char *source = "index.htm";
S>  AfxMessageBox(*strncpy_from(dest, source, 0, 3)); //должно напечатать "ind", происходит ошибка
S>

S>Выдает ошибку. Что я сделал не так?
Во-первых извени за опечатку. В реалтзации strncpy_from я упостил декримент --from:
char * __cdecl strncpy_from (char * dest,const char * source, size_t from, size_t count)
{
    char *start = dest;
    while (from--&& *source++)
        ;
    while (count && (*dest++ = *source++)) /* copy string */
        count--;
    if (count) /* pad out with zeroes */
        while (--count)
            *dest++ = '\0';
    return(start);
}

Во-вторых в оправдание себе скажу что твой код все равно не верен поскольку ты, написав
char *dest = "index.htm";

помещаеш dest в константную область памяти которая не подлежыт модификациям(в нашем случае — в теле strncpy_from)
Нужно выделять память под dest юзая например new:
char *source = "index.htm";
char *dest = new char[strlen(source)+1]; 
strncpy_from(dest, source, 0, 3);
dest[3] = '\0';
AfxMessageBox(dest);
delete[] dest;
Re[5]: Re: Re[2]: Re: Подскажите аналоги LowerCase, Pos, Ext
От: promko Украина  
Дата: 09.03.03 23:10
Оценка:
Здравствуйте, stuff, Вы писали:

S>
S>char *szSource = "index.htm";
S>char *szDestination;
S>    
S>int nPos = strcspn(szSource, ".");
S>strncpy(szDestination, szSource, nPos);  //вот здесь выдает ошибку!!!
S>szDestination[nPos]='\0';                //должны увидеть "htm" 

S>AfxMessageBox(szDestination);
S>


нехорошо не инициализировать указатели при их обьявление
если не нужна инициализация буфера тогда используй стандартные массивы
char dest[4];
Re: Подскажите аналоги LowerCase, Pos, ExtractFileExt в Visu
От: c-smile Канада http://terrainformatica.com
Дата: 10.03.03 00:42
Оценка: 3 (1)
Здравствуйте, Kill_of_Bill, Вы писали:

KOB>т.е к примеру в Delphi есть токая строка:


KOB>на Visual она будет такой:


KOB>

KOB>
KOB>if (!strcspn(_strlwr( _strdup(FileData.cFileName)), "htm") || !strcspn(_strlwr( _strdup(FileData.cFileName)), "php"))
KOB>{
KOB>...
KOB>}
KOB>


KOB>Аналога ExtractFileExt в Visual я не нашел. Подскажите если не облом.


void show_ext( const char* path )
{
char dummy[_MAX_PATH];
char ext[_MAX_EXT];
_splitpath( path, dummy, dummy, dummy, ext );
if(stricmp(ext,"htm") == 0 || stricmp(ext,"php") == 0)
printf( "Hey! I like this extension!" );
}

Успехов.
Re[2]: Подскажите аналоги LowerCase, Pos, ExtractFileExt в V
От: stuff Украина www.tarnet.pisem.net
Дата: 10.03.03 01:57
Оценка:
Спасибо promko и c-smile.
По гроб должен буду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.