Использование sstream для ввода имени выходного файла в ofstream

#c

#c

Вопрос:

Я пытаюсь использовать sstream для указания имени файла в ofstream. Но я получаю сообщение об ошибке.

 #include<iostream>
#include<fstream>
#include<sstream>
using namespace std;
int main()
{
    stringstream ss;

    for(int i = 0; i < 3; i  ) {ss<<"table"<<i;cout<<ss.str()<<endl;
        ofstream ofs(ss.str());

        ofs.close();
    }
}
  

Ошибка:

 temp2.cpp: In function ‘int main()’:
temp2.cpp:10:24: error: no matching function for call to ‘std::basic_ofstream<char>::basic_ofstream(std::basic_stringstream<char>::__string_type)’
temp2.cpp:10:24: note: candidates are:
/usr/include/c  /4.6/fstream:629:7: note: std::basic_ofstream<_CharT, _Traits>::basic_ofstream(const char*, std::ios_base::openmode) [with _CharT = char, _Traits = std::char_traits<char>, std::ios_base::openmode = std::_Ios_Openmode]
/usr/include/c  /4.6/fstream:629:7: note:   no known conversion for argument 1 from ‘std::basic_stringstream<char>::__string_type {aka std::basic_string<char>}’ to ‘const char*’
/usr/include/c  /4.6/fstream:614:7: note: std::basic_ofstream<_CharT, _Traits>::basic_ofstream() [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c  /4.6/fstream:614:7: note:   candidate expects 0 arguments, 1 provided
/usr/include/c  /4.6/fstream:588:11: note: std::basic_ofstream<char>::basic_ofstream(const std::basic_ofstream<char>amp;)
/usr/include/c  /4.6/fstream:588:11: note:   no known conversion for argument 1 from ‘std::basic_stringstream<char>::__string_type {aka std::basic_string<char>}’ to ‘const std::basic_ofstream<char>amp;’
  

Ответ №1:

Похоже, вы используете реализацию до C 11 std::ofstream : в исходном стандарте C у конструктора std::ofstream (и его родственников) не было конструктора, принимающего a std::string . Был только конструктор из char const* . Обходной путь заключается в получении соответствующей C-строки из std::string :

 std::ofstream ofs(ss.str().c_str());
  

Ответ №2:

Вам не нужно использовать string , вы можете сделать это с помощью :

ofs << ss.rdbuf();