Перенаправление в C ++ - PullRequest
       5

Перенаправление в C ++

1 голос
/ 08 сентября 2010
#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?


обновление :

Я не могу использовать решение, которое использует класс или использует глобальный, так что плз может некоторые Дайте мне решение, которое использует новое. Также передавая из основного в 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;
}

Ответы [ 2 ]

4 голосов
/ 08 сентября 2010

Я подозреваю, что к настоящему времени скомпилировал и запустил ваш код и обнаружил, что вы получаете ошибку сегментации.

Вы получаете это, потому что создаете и открываете 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;
}
1 голос
/ 08 сентября 2010

Мне кажется, что ваш код должен работать, но ... Почему бы вам не попробовать себя?Вы увидите, все ли написано в test.txt или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...