21xrx.com
2025-04-28 10:25:38 Monday
文章检索 我的文章 写文章
如何在c++中使用freopen后继续使用cin?
2023-07-06 04:29:41 深夜i     15     0
freopen c++ cin 文件重定向 I/O流

在c++中,freopen函数可以用来将标准输入输出流重定向到某个文本文件中。这种方式常用于将控制台程序输出写入文件中或从文件读取输入数据。

但是,在使用freopen函数重定向标准输入输出流后,如果想要继续使用输入流cin,会出现一些问题。因为freopen直接重定向了标准输入流,cin难以直接使用。

有另外一种方法可以解决这个问题,通过将文件打开后用ifstream来替换原来的cin。代码如下:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
  freopen("input.txt", "r", stdin); // 重定向输入流
  ifstream fin("input.txt"); // 使用ifstream重新打开输入文件
  // 开始使用fin替代cin
  int n;
  fin >> n;
  cout << n << endl;
  return 0;
}

这样,我们就可以继续使用cin了。在实际应用中,我们可以通过定义一个文件操作类,将重定向和替换操作整合到一起,以方便使用。具体代码如下:

#include <iostream>
#include <fstream>
using namespace std;
class FileIO {
public:
  FileIO(const string& inputFile = "", const string& outputFile = "")
  {
    if (!inputFile.empty()) {
      freopen(inputFile.c_str(), "r", stdin); // 重定向输入流
      if (inputFile != outputFile) { // 仅重定向输出流
        freopen(outputFile.c_str(), "w", stdout);
      }
    }
    if (!outputFile.empty() && inputFile != outputFile) {
      fout.open(outputFile.c_str());
    }
  }
  ~FileIO()
  {
    if (fout.is_open()) {
      fout.close();
    }
  }
  istream& in()
  
    return cin;
  
  ostream& out()
  {
    return fout.is_open() ? fout : cout;
  }
private:
  ofstream fout;
};
int main()
{
  FileIO fileIO("input.txt", "output.txt");
  int n;
  fileIO.in() >> n;
  fileIO.out() << n << endl;
  return 0;
}

上面的代码使用一个FileIO类来操作文件输入输出,它的构造函数中可以指定输入和输出文件名。在类中,使用重载的in()和out()函数分别代表输入和输出流,并且经过封装后可以方便地直接使用。这种方式可以更好地管理程序的文件输入输出,不仅扩展性好,而且可以减少代码的重复。

  
  

评论区

请求出错了