【问题标题】:Switch streams based on some condition in cpp [duplicate]根据cpp中的某些条件切换流[重复]
【发布时间】:2018-07-08 05:43:41
【问题描述】:

我有一个代码,其中我有两个选项可以从文件或标准输入读取输入。如果提供的file_name 是有效的,我想将流从cin 切换到fin。我怎么能实现它?这里给出一个基本的大致思路代码:

int main(){
    string default_file_name = "my_file.txt";
    string file_name = get_from_commandline_args();
    istream reader; // can't create this as constructor is private
    if(file_name == default_file_name) {
        ifstream fin; 
        fin.open (file_name);
        reader = fin;
    } else {
        reader = cin;
    }
    while(true) {
    // read input
    string str;
    reader >> str;
    }
}

这段代码只是我想要的粗略想法。代码错误,因为我们无法创建 istream 的实例

【问题讨论】:

  • 除了天真之外,你的实现有什么问题?更“正确”的方法是让两类阅读器实现相同的接口,一类使用标准输入,另一类使用文件。
  • @o_weisman 我们无法创建 istream 的实例,该行 istream reader; 将不起作用

标签: c++ iostream file-handling


【解决方案1】:

看起来像是 C++ 中原始指针的有效用例:

int main(){
    string default_file_name = "my_file.txt";
    string file_name = get_from_commandline_args();
    istream* reader = nullptr;
    ifstream fin; 
    if(file_name == default_file_name) {
        fin.open (file_name);
        reader = &fin;
    } else {
        reader = &cin;
    }
    while(true) {
    // read input
    string str;
    (*reader) >> str;
    }
}

只需将具有公共接口的类型设为指针类型即可:

istream* reader = nullptr;

相应地更改其余代码。

这是一个可编译的示例:Ex

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多