Конкатенация char + символ + char C++

177
03 октября 2018, 07:20

Есть такой код:

cout<<"Type path - ";
char path[NAME_MAX];
cin >> path;
DIR *check_dir;
check_dir = opendir(path);
if(check_dir){
    cout << "Какой файл создать? - ";
    char filename[NAME_MAX];
    cin>>filename;
    filename = path + "/" + filename; //эта строка помечается как ошибка.
    ifstream file;
    file.open(filename);
    if(file){
        cout<< "Exixts";
    }else{
        cout<<"Not exists";
    }
}else{
    cout << "Directiry not found";
}
return 0;

Нужно склеить:

char + "/" + char;

Есть ли решение?

Я пытаюсь донести до читающего проблему: Если я буду использовать string, то будет ошибка при открытии директории. По какой-то причине(мне не известной, opendir принимает только const char* как параметр) Вот что получается при попытке использовать string:

cout<<"Type path - ";
string path;
cin >> path;
DIR *check_dir;
check_dir = opendir(path);//Эта строка становится ошибкой
if(check_dir){
    cout << "Какой файл создать? - ";
    string filename;
    cin>>filename;
    filename = path + "/" + filename; 
    ifstream file;
    file.open(filename);
    if(file){
        cout<< "Exixts";
    }else{
        cout<<"Not exists";
    }
}else{
    cout << "Directiry not found";
}
return 0;

error: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘const char*’ for argument ‘1’ to ‘DIR* opendir(const char*)’

Answer 1

Вы в строке:

filename = path + "/" + filename;

пытаетесь сложить два указателя на char и строковой литерал. Эта операция в принципе невозможна в данном виде. Для простой конкатенации, раз вы уж пишете на с++, следует использовать класс string. Тогда конкотенация будет выглядеть как то так:

std::string str = path;
str += "/";
str += filename;

Это если ваши строки (path, filename) оставить в той же форме (char *). Если же их тоже перевести в string то можно и так:

std::string str = path + '/' + filename.

PS Из string можно вернуть текст как указатель на массив char. Для этого нужно использовать метод c_str()

Answer 2
  • C++. Как уже отметили в комментариях, пользуйтесь std::string и забудьте об этой головной боли.
  • С. Используйте char * strcat( char * destptr, const char * srcptr );. Эта функция добавляет информацию по указателю srcptr к информации по указателю destptr. Можно прибавить и строковый литерал типа "/"
READ ALSO
Как сделать рекурсивный поиск по файлам только определенного расширения?

Как сделать рекурсивный поиск по файлам только определенного расширения?

Есть такая функция, которая ищет файлы в выбранном каталоге и его подкаталогах, а потом записывает пути к файлам в datatxt

144
Как задать директорию С++

Как задать директорию С++

Мне нужно взаимодействовать с файлом paroli_ot_vk_druzeitxt

181
Что быстрее? cin&gt;&gt;buff или read(0,buff,size)

Что быстрее? cin>>buff или read(0,buff,size)

Сказано, что read это системный вызов, и его преимущество перед функциями из других библиотек, в том, что по определению системный вызов должен...

159
Макрос-функция в С++

Макрос-функция в С++

Функция должна сравнивать параметры x и y и присваивать r значение большегоКак можно её реализовать так, чтобы всё не ломалось при передаче...

167