我正在尝试使用ostream对象将其写入基于字符串流的用户输入的文件流(类似于Linux中的fmemopen
)。
我意识到ostream不会采用stringstream或fstream对象,而是采用stringbug或filebuf。
我尝试了以下代码:
char content[] = "This is a test";
if (isFile)
{
filebuf fp;
fp.open(filename, ios::out);
ostream os(&fp);
os << content;
fp.close();
}
else
{
stringbuf str;
ostream os(&str);
os << content;
}
在if else条件下,此方法工作正常,但我想在if else条件之外将ostream os
用作os << content
。但是问题是我无法全局定义ostream os,因为没有用于ostream的此类构造函数。
有没有办法解决这个问题?
答案 0 :(得分:3)
这可以通过几种不同的方式来处理。
使用助手功能:
void write(ostream &os, const char *content)
{
os << content
}
...
char content[] = "This is a test";
if (isFile)
{
ofstream ofs(filename);
write(ofs, content);
}
else
{
ostringstream oss;
write(oss, content);
string s = oss.str();
// use s as needed...
}
或者,使用lambda:
char content[] = "This is a test";
auto write = [](ostream &os, const char *content){ os << content; }
if (isFile)
{
ofstream ofs(filename);
write(ofs, content);
}
else
{
ostringstream oss;
write(oss, content);
string s = oss.str();
// use s as needed...
}
使用指针代替:
char content[] = "This is a test";
std::unique_ptr<ostream> os;
if (isFile)
os = std::make_unique<ofstream>(filename);
else
os = std::make_unique<ostringstream>();
*os << content;
if (!isFile)
{
string s = static_cast<ostringstream*>(os.get())->str(); // or: static_cast<ostringstream&>(*os).str()
// use s as needed...
}