我可以将 ifstream 重定向到 cin 吗?

Can I redirect an ifstream to cin?

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

我不想使用 cin 从终端获取数据,而是想读入一个包含我需要解析的信息的文件,但我不想修改我所有的 header 和 .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 的第一个字符。

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

只需将指针交换到 std::streambuf:

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

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

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

这里有一个非常简单快捷的方法。

如果您的文件名为 "file.txt",代码将是:

fstream cin("file.txt");

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