gpt4 book ai didi

c++ - 在 C++ 中重定向

转载 作者:行者123 更新时间:2023-11-30 01:31:04 29 4
gpt4 key购买 nike

#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


更新:

我不能使用使用类或使用全局的解决方案,所以请问一些给我使用新的解决方案。还将从 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;
}

最佳答案

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

你得到这个是因为你在 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++ - 在 C++ 中重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3667201/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com