我正在尝试仅使用变量来处理ifstream
和istringstream
。我知道他们都是istream
的孩子。所以,我试图只创建一个istream
类型的变量,并根据一些输入进行初始化。
真正的问题是我要求用户输入文件路径或文件内容。然后,我将逐行阅读。我试着这样做。
istream * stream;
if(isFile){
ifstream a("fileOrContent");
stream = &a;
} else {
istringstream a("fileOrContent");
stream = &a;
}
getline(stream,line)
// do something with line
我也试过这个
ifstream stream;
if(isFile){
ifstream stream("fileOrContent");
} else {
istringstream stream("fileOrContent");
}
getline(stream,line)
// do something with line
目前,我为每个代码使用了两个完整的代码副本。有关我如何做的任何建议吗?
谢谢
答案 0 :(得分:5)
如何重构代码:
void process(std::istream & is)
{
// ....
}
int main()
{
if (isFile)
{
std::ifstream is("foo.txt");
process(is);
}
else
{
std::istringstream is(str);
process(is);
}
}
答案 1 :(得分:4)
你要做的是这样的事情:
istream * stream;
if(isFile){
stream = new ifstream("fileOrContent");
} else {
stream = new istringstream("fileOrContent");
}
getline(*stream,line)
那就是说你应该使用一个智能指针来保存istream指针以避免内存泄漏,正如@πάνταῥεῖ所指出的那样。
答案 2 :(得分:1)
我刚做了类似的事情。你快到了
if(isFile) {
stream = new ifstream("whatever");
} else {
stream = new istringstream("whatever");
}
getline(*stream, line);
确保删除它
答案 3 :(得分:1)
如果您不想自己管理内存,可以使用unique_ptr
,当内存超出范围时会自动释放内存:
#include <memory>
std::unique_ptr<std::istream> stream;
if(isFile){
stream = std::unique_ptr<std::istream>(new ifstream("fileOrContent"));
} else {
stream = std::unique_ptr<std::istream>(new istringstream("fileOrContent"));
}
getline(*stream,line)
答案 4 :(得分:0)
放getline
和&#34;用线&#34;做点什么在一个带有std::istream &
参数的函数中。
然后创建ifstream
或istringstream
,并将函数调用放入if / else分支。
void DoSomethingWithLine(std::istream &stream)
{
getline(stream,line);
// do something with line
}
if (isFile){
ifstream a("fileOrContent");
DoSomethingWithLine(a);
} else {
istringstream a("fileOrContent");
DoSomethingWithLine(a);
}
它不会比这简单得多。