其他分享
首页 > 其他分享> > 在C中重定向

在C中重定向

作者:互联网

#include <iostream>
#include <fstream>
using namespace std;

void foo(){
  streambuf *psbuf;
  ofstream filestr;
  filestr.open ("test.txt");
  psbuf = filestr.rdbuf(); 
  cout.rdbuf(psbuf);    
}

int main () {
  foo();
  cout << "This is written to the file";
  return 0;
}

cout会写入给定文件吗?

如果没有,有没有办法在不将变量像新变量一样发送到foo的情况下做到这一点?

更新:

我不能使用使用类或全局使用的解决方案,所以请
给我使用新的解决方案.也将main传递给foo

streambuf *psbuf;
ofstream filestr;

应该工作正常吗?

我正在尝试这样做,但无法正常工作?
我将流传递给foo,因此它存在于主目录中,因此在foo完成时不会结束.

 void foo(streambuf *psbuf){

  ofstream filestr;
  filestr.open ("test.txt");
  psbuf = filestr.rdbuf(); 
  cout.rdbuf(psbuf);    
}

int main () {
streambuf *psbuf
  foo(psbuf);
  cout << "This is written to the file";
  return 0;
}

解决方法:

我怀疑现在编译并运行您的代码,发现您遇到了分段错误.

之所以会这样,是因为您在foo()中创建并打开了一个Ofstream对象,然后在foo的末尾销毁(并关闭了该对象).当您尝试在main()中写入流时,您尝试访问一个不再存在的缓冲区.

一种解决方法是使您的filestr对象成为全局对象.有很多更好的!

编辑:这是@MSalters建议的更好的解决方案:

#include <iostream>
#include <fstream>

class scoped_cout_redirector
{
public:
    scoped_cout_redirector(const std::string& filename)
        :backup_(std::cout.rdbuf())
        ,filestr_(filename.c_str())
        ,sbuf_(filestr_.rdbuf())
    {
        std::cout.rdbuf(sbuf_);
    }

    ~scoped_cout_redirector()
    {
        std::cout.rdbuf(backup_);
    }

private:
    scoped_cout_redirector();
    scoped_cout_redirector(const scoped_cout_redirector& copy);
    scoped_cout_redirector& operator =(const scoped_cout_redirector& assign);

    std::streambuf* backup_;
    std::ofstream filestr_;
    std::streambuf* sbuf_;
};


int main()
{
    {
        scoped_cout_redirector file1("file1.txt");
        std::cout << "This is written to the first file." << std::endl;
    }


    std::cout << "This is written to stdout." << std::endl;

    {
        scoped_cout_redirector file2("file2.txt");
        std::cout << "This is written to the second file." << std::endl;
    }

    return 0;
}

标签:c,cout,redirect,stdout,io-redirection
来源: https://codeday.me/bug/20191013/1907954.html