gpt4 book ai didi

c++ - 使用相同的流对象写入文件流或字符串流

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:13 25 4
gpt4 key购买 nike

我正在尝试使用 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 条件下工作正常,但我想使用 ostream os , 作为 os << content , 在 if else 条件之外。但是问题是我无法全局定义 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...
}

关于c++ - 使用相同的流对象写入文件流或字符串流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55642967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com