1
#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 的情况下做到这一点,比如new


更新

我不能使用使用类或使用全局的解决方案,所以请给我一些使用新的解决方案。还将 from main 传递给 foo

streambuf *psbuf;
ofstream filestr;

应该工作吗?

我正在尝试这样做,但它不起作用?我将流传递给 foo 所以它存在于 main 中,所以当 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;
}
4

2 回答 2

4

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

你得到这个是因为你在里面创建并打开了一个ofstream对象foo(),然后在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;
}
于 2010-09-08T11:41:40.247 回答
1

在我看来,你的代码应该可以工作,但是......你为什么不自己试试呢?您将看到是否所有内容都写在 test.txt 中。

于 2010-09-08T11:40:47.500 回答