Visual Studio std::cin.rdbuf(in.rdbuf())导致重定向时崩溃

mrphzbgm  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(174)

我试图将cin重定向到visual studios 2015中的一个文件,但每次它运行std::cin.rdbuf(in.rdbuf())行时,程序都会崩溃
我正在Windows 10上写C++ 14。下面是完整的代码。

std::cout << "Filename: " << filename << endl;
try {
    std:ifstream in(filename);
    if (in.rdbuf() == nullptr) cout << "FAILED!!!!" << endl;
    std::cin.rdbuf(in.rdbuf());
    return true;
}catch (exception& e){
    std::cout << "error: " << e.what() << std::endl;
    return false;
}
catch (...) {
    cerr << "UNKNOWN Exception in parsing file in stream";
    return 2;

}
vatpfxk5

vatpfxk51#

6年后,我遇到了一个类似的问题,我试图将标准输出(在我的例子中是cerr,但是coutclog的工作原理是一样的)重定向到一个文件,这个问题运行得很好,* 但是 * 导致我的程序在到达main()结尾时崩溃,并出现segfault。
我必须在退出main()之前恢复标准输出来解决这个问题,下面是我的代码:

int main(int argc, char *argv[])
{
  std::ofstream err;
  std::streambuf *oldbuf = nullptr;
  if (some_condition)
  {
    err = std::ofstream(argv[4]);
    oldbuf = std::cerr.rdbuf(err.rdbuf());
  }

  /** incredible code.png **/

  // Close the redirection ofstream (if used)
  if (err.is_open())
  { err.close(); }

  // Restore cerr stream buffer (else: segfault!)
  if (oldbuf)
  { std::cerr.rdbuf(oldbuf); }

  return EXIT_SUCCESS;
}

请注意,std::cerr.rdbuf()在调用之前返回指向流缓冲区的指针,因此返回oldbuf = std::cerr.rdbuf(err.rdbuf());行。
我希望这对某人有用:)

相关问题