使用相同的流对象写入文件流或字符串流
Using same stream object to write to filestream or stringstream
我正在尝试使用 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 没有这样的构造函数。
有办法解决这个问题吗?
这可以通过几种不同的方式处理。
使用辅助函数:
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...
}
我正在尝试使用 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 没有这样的构造函数。
有办法解决这个问题吗?
这可以通过几种不同的方式处理。
使用辅助函数:
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...
}