-1

これは一部のコンパイラでは問題なく動作しました... 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 *')

4

3 に答える 3

1

C++11 標準 27.9.1.10 によると、basic_ofstream のコンストラクターの 1 つは次のとおりです。

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コンパイル時に or higher フラグを使用する必要があることを忘れないでください。

于 2015-07-13T17:01:04.080 に答える
1

「+」演算子は C スタイルの文字列には使用できません。これを試して:

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

std::string 型を c++ スタイルの連結として作成し、ac 文字列として open に渡します。

于 2015-07-13T17:01:18.437 に答える
1

C++11 ではos.open( file + ".dat" )問題なく動作します。C++11 より前std::ofstream::openでは、文字列を取るものはなかったので、 と書く必要がありましたos.open( (file + ".dat").c_str() )。括弧とその先に注意してください。最初.c_str()のものと連結し、結果std::stringのみを呼び出す必要.c_str()があります。

于 2015-07-13T17:58:43.953 に答える