Это работает нормально на некоторых компиляторах … Есть ли способ сделать это, если он будет работать без проблем с различными компиляторами на c ++ 11 или c ++ 14?
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void save_file() {
string file;
ofstream os;
cout << "Save As: ";
getline(cin, file, '\n');
os.open(file + ".dat");
//rest of code
}
ошибка: нет жизнеспособного преобразования из ‘basic_string, std :: allocator>’ в ‘const char *’
Так что я погуглил его, нашел ответы на некоторые вопросы, или, в этом случае, canswers (рак), попытался
os.open(file.c_str() + ".dat");
ошибка: неверные операнды в двоичном выражении (‘const char *’ и ‘const char *’)
Согласно стандарту C ++ 11 27.9.1.10 одним из конструкторов для basic_ofstream является:
explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out);
Это означает, что любой стандартный совместимый компилятор должен иметь возможность компилировать:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string file = "temp";
ofstream os;
os.open(file + ".dat");
}
Не забывайте, что вам нужно использовать -std=c++11
или более высокий флаг при компиляции.
Оператор «+» не может использоваться для строк в стиле C. Попробуй это:
string name = file+".dat";
os.open(name.c_str());
Вы создаете тип std :: string как конкатенацию в стиле c ++, а затем передаете его для открытия в виде строки c.
В C ++ 11 os.open( file + ".dat" )
работает просто отлично. До C ++ 11 не было std::ofstream::open
который взял строку, поэтому вы должны были написать os.open( (file + ".dat").c_str() )
, Обратите внимание на круглые скобки и где .c_str()
идет — вы должны объединить с std::string
первый и единственный звонок .c_str()
по результатам.