Добавить целое число в конец const char * c ++ - PullRequest
0 голосов
/ 01 сентября 2010

У меня есть const char* FilePathName, который выглядит так: C:\ImportantFile.hex
И int id = 12345;
Мне нужно определить новый const char* FilePathName_ID, который бы добавил идентификатор с подчеркиванием к исходному FilePathName, чтобы он выглядел так: C:\ImportantFile_12345.hex
Я посмотрел на this , но он отличается, так как я использую const char *, который выдает мне ошибку cannot convert from 'const char * ' to 'char' и требует подчеркивания.
Мне нужно в конечном итоге с const char*
РЕДАКТИРОВАТЬ Мне нужно сохранить расширение файла.

Ответы [ 4 ]

3 голосов
/ 01 сентября 2010

Вам необходимо создать новый объект std::string или строку байтов с нулевым символом в конце.Один простой способ заключается в следующем:

std::string append_number(std::string const& x, unsigned int num, char sep = '_') {
    std::stringstream s;
    s << strip_extension(x) << sep << num;
    return s.str();
}

Вы можете без проблем передать строковый литерал в вышеприведенную функцию.

Обновление: я заметил, что вам, вероятно, также необходимо удалить расширение:

std::string strip_extension(std::string x, char ext_sep = '.') {
     return x.substr(0, x.find_last_of(ext_sep));
}

std::string get_extension(std::string const& x, char ext_sep = '.') {
     return x.substr(x.find_last_of(ext_sep) + 1); // no error checking 
}

См. Обновленное определение append_number.

Обновление 2: Попробуйте следующую программу:

#include <string>
#include <iostream>
#include <sstream>

std::string strip_extension(std::string const& x, char ext_sep = '.') {
     return x.substr(0, x.find_last_of(ext_sep));
}

std::string append_number(std::string const& x, unsigned int num, char sep = '_') {
        std::stringstream s;
        s << strip_extension(x) << sep << num << '.' << get_extension(x);
        return s.str();
    }

int main() {
  std::cout << append_number("file.hex", 45) << std::endl;
}

Вывод должен быть:

file_45.hex
0 голосов
/ 01 сентября 2010

Примечание. Любой const char *, возвращаемый с помощью c_str () из std :: string, будет действителен только до тех пор, пока std :: string находится в области действия.Вы можете получить указатель, но после того, как строка исчезнет, ​​это будет мусором.

Вы должны быть в состоянии передать символ * в функцию, принимающую символ const * - похоже, основная проблема заключается в создании / сохранении действительного указателя.

0 голосов
/ 01 сентября 2010

Как сказал Микероби, вы можете использовать sprintf, чтобы справиться с этим:

char szAppended[MAX_PATH+10]; // ensure to have enough space for the path and ID
char szNoExt[MAX_PATH];
strcpy(szNoExt, FilePathName);
char *pExt = strrchr(szNoExt, '.');
*pExt = '\0';
sprintf(szAppended, "%s_%d.%s", szNoExt, id, pExt + 1);

Вы, вероятно, также должны добавить некоторые проверки памяти на наличие расширения.

0 голосов
/ 01 сентября 2010
 ostringstream oss;
 oss << FilePathName << "_" < id;
 const char* FilePathNameID = oss.str().c_str();
...