2013-09-01 4 views
2

Моей функция передается именем файла типаИзменение расширения проходного файла

char *myFilename; 

Я хочу, чтобы изменить существующее расширение на «.sav», или, если нет расширения, просто добавить». sav "до конца файла. Но мне нужно рассмотреть файлы с именем «myfile.ver1.dat».

Может ли кто-нибудь дать мне представление о наилучшем способе достижения этого.

Я рассматривал возможность использования функции, чтобы найти последнюю "." и удалите все символы после него и замените их на «sav». или если нет "." , просто добавьте «.sav» в конец строки. Но не знаете, как это сделать, поскольку я запутался в части «\ 0» строки и вернул ли strlen всю строку с «\ 0» или мне нужно добавить +1 к длине строки после.

Я хочу в конечном итоге с именем файла пройти до fopen().

ответ

1

Может быть что-то вроде этого:

char *ptrFile = strrchr(myFilename, '/'); 
ptrFile = (ptrFile) ? myFilename : ptrFile+1; 

char *ptrExt = strrchr(ptrFile, '.'); 
if (ptrExt != NULL) 
    strcpy(ptrExt, ".sav"); 
else 
    strcat(ptrFile, ".sav"); 

А потом традиционный способ, удалить и переименовать

+0

Большое спасибо. Я отмечаю это как ответ, так как он отлично работает, а также способен справляться с ситуацией, когда путь к файлу «/folder.1/myfile.data». который я даже не рассматривал, может вызвать проблему, но вызывающе. – Scott

0

StrLen возвращает количество символов в строке, но массивы индексируются от 0 так

имя_файла [STRLEN (имя файла)]

является нуль-терминатор.

int p;

для (р = STRLEN (имя файла) - 1; (р > 0) & & (имя_файла [р] =); P--! '')

будет цикл к нулю, если нет расширения и в противном случае остановитесь в правильном месте.

+0

Приветствия для выяснения того, как работает strlen, теперь имеет намного больше смысла. – Scott

1

Вот что-то ленивое я взбитый, это минимальное использование стандартных функций библиотеки (может быть, вы хотели бы что-то, что делает?):

#include <stdio.h> 
#include <string.h> 


void change_type(char* input, char* new_extension, int size) 
{ 
    char* output = input; // save pointer to input in case we need to append a dot and add at the end of input 
    while(*(++input) != '\0') // move pointer to final position 
     ; 

    while(*(--input) != '.' && --size > 0) // start going backwards until we encounter a dot or we go back to the start 
     ; 
    // if we've encountered a dot, let's replace the extension, otherwise let's append it to the original string 
    size == 0 ? strncat(output, new_extension, 4) : strncpy(input, new_extension, 4); 
} 

int main() 
{ 
    char input[10] = "file"; 

    change_type(input, ".bff", sizeof(input)); 

    printf("%s\n", input); 

    return 0; 
} 

И действительно печатает file.bff. Имейте в виду, что это увеличивает длину до 3 символов.