fstream .open并将.txt或.dat附加到文件名

时间:2015-07-13 16:51:49

标签: c++ c++11 c++14 c-str

这在一些编译器上运行良好...有没有办法做到这一点,它只是工作而不是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
}

错误:没有可行的转换来自&#39; basic_string,std :: allocator&gt;&#39; to&#39; const char *&#39;

所以我google它,找到了一些答案,或者在这种情况下,canswers(癌症),尝试了

os.open(file.c_str() + ".dat");

错误:二进制表达式的操作数无效(&#39; const char *&#39;和&#39; const char *&#39;)

3 个答案:

答案 0 :(得分: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");
}

Live Example

不要忘记编译时需要使用-std=c++11或更高的标记。

答案 1 :(得分:1)

“+”运算符不能用于C风格的字符串。试试这个:

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

您将std :: string类型创建为c ++样式的串联,然后将其作为c字符串传递给open。

答案 2 :(得分:1)

在C ++ 11中,os.open( file + ".dat" )工作正常。在C ++ 11之前,没有std::ofstream::open接受字符串,所以你必须写os.open( (file + ".dat").c_str() )。请注意括号和.c_str()所在的位置 - 您必须首先与std::string连接,并且只对结果调用.c_str()