【问题标题】:Redirecting output to file then back to console in C++将输出重定向到文件然后返回到 C++ 中的控制台
【发布时间】:2020-09-14 07:05:15
【问题描述】:

任务是从input.txt 读取输入并将输出写入output.txt。 但是,在完成上述任务后,现在应该在控制台上显示更多指令/输出。

开始了解 c++ 中的 freopen(),它在给定任务的前半部分工作得很好。但不幸的是,我不知道如何将输出再次重定向回控制台。

void writeIntoFile(){

   freopen("input.txt","r",stdin); // Task 1. Reading from input.txt file
   freopen("output.txt","w",stdout); // Task 2. Writing to output.txt file
   printf("This sentence is redirected to a file.");
   fclose(stdout);
   printf("This sentence is redirected to console"); // Task 3. Write further output to console

}

我对 fclose() 的期望是它最终会写入文本文件,因此会进一步将输出写入控制台,但事实并非如此。我怎样才能完成任务 3。

【问题讨论】:

  • 首先不要使用freopen 或重定向。如果您使用 C++ 编写,请使用 C++ 流,然后正常打开它然后写入。
  • 我明白,但在那种情况下,我将不得不像 file>>text 一样单独编写所有输出;这可以通过 freopen() 自动完成,因此我选择了这个。
  • 我们有不同的流对象,以便我们可以使用它们来获得最大的可读性和正确性。到处重新打开文件意味着你的代码很神秘,无法阅读。
  • 更不用说“原始流(如果存在)已关闭。” -- 这可能是也可能不是有意的。
  • 也许 rdbuf 是您正在寻找的? cplusplus.com/reference/ios/ios/rdbuf

标签: c++ file stdin freopen


【解决方案1】:

您可能正在寻找的是 doomista 在 cmets 中提到的 rdbuf()。

这是一种重定向输出的方法。

#include <iostream>
#include <fstream>

int main()
{
    /** backup cout buffer and redirect to out.txt **/
    std::ofstream out("out.txt");

    auto *coutbuf = std::cout.rdbuf();
    std::cout.rdbuf(out.rdbuf());

    std::cout << "This will be redirected to file out.txt" << std::endl;

    /** reset cout buffer **/
    std::cout.rdbuf(coutbuf);

    std::cout << "This will be printed on console" << std::endl;

    return 0;
}

【讨论】:

  • 是的,我想通了,但忘了提及。无论如何,这是一个更实施的答案。
猜你喜欢
  • 2015-04-20
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2014-01-09
  • 1970-01-01
  • 2021-10-21
  • 2013-11-14
相关资源
最近更新 更多