通过代码建立是否应将控制台保存到文件(以及此类文件的名称)

时间:2017-06-17 19:10:24

标签: c++ c logging console programmatically

我知道当在控制台中执行程序时,可以指定可以保存控制台的输出文件。例如,在Windows中:

C:\>myprogram.exe > output.txt

但是,有没有办法建立通过代码,即以编程方式:1)是否应将控制台保存到文件中; 2)应保存输出的文件的名称(如果有)。

我知道我当然可以使用fprintstd::cout将每个字符串打印到一个文件,就像我可以对控制台做的一样。但出于性能考虑,我想知道是否可以通过代码建立整个控制台应保存到文件中。

2 个答案:

答案 0 :(得分:0)

是的,您可以编写如下代码:

  int main( int argc, char * argv[] ) {
      if ( argc > 1 ) {
         // there is a filename on the command line
         ofstream ofs( argv[1] );       // open named file
         // do something with ofs
      }
      else {
          // do something with standard output
      }
  }

答案 1 :(得分:0)

您可以使用dup2功能(在Windows _dup2中)。它可以解决以独占方式登录控制台或专门登录文件的问题。这不是一个记录到两者的解决方案。

你可以使用一些日志库(log4cxx,log4cpp,Boost.Log,QDebug等)他们应该具备你需要的能力 - 例如登录到控制台和文件。

dup2 / _dup2

的解决方案

您可以打开新文件,然后调用dup2与该打开的文件交换stdout。它可以与c ++流一起使用,但我没有尝试过。

Microsoft示例的相关部分(删除了所有检查,请求original example。我没有Windows,因此我无法对其进行验证。)

#include <stdlib.h>  
#include <stdio.h>  
#include <io.h>  

int main(int argc, char ** argv) {
    FILE *DataFile;
    fopen_s( &DataFile, "data", "w" ); // open file "data" for writing
    _dup2( _fileno( DataFile ), 1 ); // exchange "standard output/console" with file "data"

    printf("this goes to 'data' file'\r\n"); // print to standard output, but it will be saved to "data" file

    fflush( stdout );  
    fclose( DataFile );
}

完整的Linux验证和工作C ++示例

#include <stdlib.h>  
#include <stdio.h>  
#include <unistd.h>

#include <iostream>

int main(int argc, char ** argv) {
    FILE *DataFile;
    DataFile = fopen( "data", "w" ); // open file "data" for writing
    dup2( fileno( DataFile ), 1 ); // exchange "standard output/console" with file "data"

    std::cout << "this goes to 'data' file from c++" << std::endl;

    fflush( stdout );  
    fclose( DataFile );
}