Я работаю над проектом, который был первоначально выбран в C, но хочу работать над ним в C ++.
Есть раздел, где используется strcat (), мне сказали использовать альтернативу. Я нашел один Вот, но когда я пытаюсь это сделать, компилятор выдает мне следующую ошибку:
ошибка: недопустимые операнды типов
char*' and
char * ‘к бинарному оператору +
Есть ли что-то, что я делаю не так?
Редактировать:
Вот часть кода, которая не работает
FILE *FileOpen(string *fname, string* mode){
FILE *fp;
string *str = "";
str += "tmp/"; //all files to be created in temporary sub directory
str += fname;
if((fp=fopen(str,mode))==NULL){
fprintf(stderr,"Cannot open file: %s\n", &fname);
exit(1);
}
FileReader(fname);
return(fp);
}
Изменить 2:
Для тех, кто интересуется, почему у меня есть FileReader: это для второй части проекта. Разборка кода.
Спасибо за размещение вашего кода; Теперь проблема очевидна.
Вы должны использовать строковые объекты, а не указатели на них.
FILE *FileOpen(string fname, string mode)
{
string str = "";
str += "tmp/"; //all files to be created in temporary sub directory
str += fname;
FILE *fp = fopen(str.c_str(), mode.c_str());
if (!fp) {
fprintf(stderr, "Cannot open file: %s\n", fname.c_str());
exit(1);
}
FileReader(fname);
return fp;
}
Хорошим следующим шагом будет переход к функциям ввода / вывода, которые принимают std::string
аргументы, так что вам не нужно говорить .c_str()
везде.
Я также запутался, почему у вас FileReader(fname)
внутри вашей функции открытия файлов. Это дважды нарушает принцип единой ответственности. Открытие файла не должно вызывать его чтение, и код, читающий файл, должен использовать FILE*
и не важно, какое имя файла (кроме, возможно, для генерации сообщений об ошибках).
Вы не показали никакого кода, но я подозреваю, что у вас было что-то вроде этого
char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
strcpy(buf, s1);
strcat(buf, s2);
и теперь вы изменили его на
char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
buf = s1 + s2;
Это не работает, как вы уже заметили. Вы должны изменить указатели на символы и массив символов на std::string
также
std::string s1 = "Hello, ", s2 = "world!";
std::string buf = s1 + s2;
Если ваш код использует char *
как строки strcat
это, вероятно, правильная функция для вас. Конечно, решение C ++ заключается в использовании std::string
в этом случае вы можете просто использовать +
— так как есть двоичный operator+
доступны для std::string
,
ну, в C ++ есть строковый класс std::string
чей оператор + выполняет конкатенацию. Но сначала нужно создать.
так что выражение"abc" + "def"
не компилируется, но std::string("abc")+"def"
работает отлично.
В качестве альтернативы вы можете написать что-то вроде
std::string s("abc");
s += "def";
так же,
std::string s = "abc";
s += "def";
если вы хотите объединить большой объем текста и заботиться о производительности, рассмотрите возможность использования std::ostringstream
,