перенаправить cout в файл - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу перенаправить cout в файл при необходимости.Вот основная часть моей тестовой программы, но я не могу понять, что некоторые входные данные не были направлены в файл.

     ucla();
     ucla() { 
        std::cout << "inside ucla" << std::endl;
      }

     int main() {
           const char* outName = argv[2];                                                                                          
           std::string outFile(outName);                                                                                                                                                                                                                   
           std::streambuf *coutbuf, *termbuf;                                                                                      
           termbuf = std::cout.rdbuf();                                                                                                                                                                                                                    
           if (!outFile.empty()) {                                                                                                         
                 std::ofstream outstr;                                                                                                   
                 outstr.open(argv[2]);                                                                                                   
                 coutbuf = outstr.rdbuf();                                                                                               
                 std::cout.rdbuf(coutbuf);                                                                                               
                 std::cout << "here" << std::endl;                                                                               
           } else {std::cout.rdbuf(termbuf);}                                                                                                                                                                                                              
           std::cout << "this file " << std::endl;  

          ucla();
          }

Когда программа запущена, только здесь была записана в файл, яожидаю, что этот файл внутри ucla Я искал более ранние темы, и я не могу понять, чего не хватает.Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Ваша программа имеет неопределенное поведение.

coutbuf уничтожается при уничтожении outstr.Поскольку вы не сбросили rdbuf из cout, когда закончился if -блок, cout указывает на висящий rdbuf за пределами if -блока.


Предложение по уборке.Всегда указывайте тип возврата для функций.Вместо

ucla();

используйте

void ucla();

Обновление в ответ на комментарий ОП

Для решения проблемы будет полезно переместить все«код приложения» для другой функции и вызов этой функции из main.Оставьте rdbuf код обработки в main.

void ucla()
{
   std::cout << "inside ucla" << std::endl;
}

void application_main()
{
   std::cout << "here" << std::endl;
   std::cout << "this file " << std::endl;
   ucla();
}

int main()
{
   const char* outName = argv[2];
   std::string outFile(outName);

   // Save the rdbuf of cout.
   std::streambuf* coutbuf = std::cout.rdbuf();

   termbuf = std::cout.rdbuf();
   if (!outFile.empty())
   {
      std::ofstream outstr;
      outstr.open(argv[2]);
      std::cout.rdbuf(outstr.rdbuf());

      // Needs to be here so that every use of cout will redirect the output
      // to the file.
      application_main();
   }
   else
   {
      // In this branch, use of cout will produce output in the console.
      application_main();
   }

   // Restore the rdbuf of cout.
   std::cout.rdbuf(coutbuf);
}
...