fstream .open и добавление .txt или .dat к имени файла

Это работает нормально на некоторых компиляторах … Есть ли способ сделать это, если он будет работать без проблем с различными компиляторами на 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 *’)

-1

Решение

Согласно стандарту 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 или более высокий флаг при компиляции.

1

Другие решения

Оператор «+» не может использоваться для строк в стиле C. Попробуй это:

string name = file+".dat";
os.open(name.c_str());

Вы создаете тип std :: string как конкатенацию в стиле c ++, а затем передаете его для открытия в виде строки c.

1

В C ++ 11 os.open( file + ".dat" ) работает просто отлично. До C ++ 11 не было std::ofstream::open который взял строку, поэтому вы должны были написать os.open( (file + ".dat").c_str() ), Обратите внимание на круглые скобки и где .c_str() идет — вы должны объединить с std::string первый и единственный звонок .c_str() по результатам.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector