【问题标题】:Can I redirect an ifstream to cin?我可以将 ifstream 重定向到 cin 吗?
【发布时间】:2016-03-04 12:43:23
【问题描述】:

我有一个程序从终端读取输入,来自cin 的流在多个类中用于不同级别的解析。

我不想使用cin 从终端获取数据,而是想读入一个包含我需要解析的信息的文件,但我不想修改所有头文件和 .cpp 文件以接受ifstream& 参数。

为了保留现有代码,我试图简单地将ifstream 重定向到 cin,但不知道如何。

所以假设我在 main 中有以下内容:

ifstream inFile("myfile.txt", ifstream::io);

string line;
while(getline(inFile, line)) 
{
  char firstChar;
  inFile >> firstChar;
  cout << firstChar;
  inFile.ios::rdbuf(cin.rdbuf());
  Continue myFile;
} 

在我的continue.cpp 我只是在做:

Continue()
{
   string line;
   cin >> line;
   cout << "---remaining line: " << line << "\n";
}

但是它只打印 main 中的第一个字符。

【问题讨论】:

  • "但我不想修改所有头文件和 .cpp 文件以接受 ifstream& 参数。"真不幸。
  • @AmiTavory 啊,好吧,所以没办法了?
  • 是的。查看 dup 和 dup2 函数(Windows 的前缀为 _)。我只是在寻找一个例子。
  • @free_mind 可能有一些关于它的黑客攻击。尽管如此,最直接的事情就是在代码中表达您正在使用 istream 的某些(子类)对象。我个人认为,欺骗和东西只是掩盖了这一点。
  • @free_mind 你真的应该将你的课程与std::cin 分离。当您使用它时,您可以让他们使用std::istream 而不是std::ifstream 进行阅读——这样您就可以同时使用std::cinstd::ifstream

标签: c++ ifstream


【解决方案1】:

只需交换指向std::streambuf的指针:

ifstream file("myfile.txt");
string line;
if (file.is_open()) {
    cin.rdbuf(file.rdbuf());  // swap
    cin >> line;
}
std::cout << line;

【讨论】:

  • 我认为这样做可以,但我收到一个错误 `std::istream' has no member named 'set_rdbuf'
  • 如你所知,我是 C++ 新手 :-P
  • 我刚刚将其更改为cin.rdbuf(file.rdbuf()),并且成功了!非常感谢
  • 我在 Windows 上,VS 2012。rdbuf 也适用于我。也许这个解决方案更加多平台。
【解决方案2】:

istream 对象从std::streambuf 中读取,并且可以换入换出。相关成员函数为.rdbuf

【讨论】:

    【解决方案3】:

    您还可以将底层 C stdin 文件句柄重定向到不同的文件,这也会影响您的 cin

    freopen ("myfile.txt", "r", stdin);
    

    【讨论】:

      【解决方案4】:

      这是一个非常快速和简单的方法。

      如果您的文件名为“file.txt”,则代码为:

      fstream cin("file.txt");
      

      这样,文件中的所有内容都将被重定向到 cin >>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多