0

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

C:\>myprogram.exe > output.txt

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

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

4

2 回答 2

0

您可以使用dup2功能(在 windows 中_dup2)。它可以解决独占登录到控制台或独占登录文件的问题。这不是同时登录的解决方案。

您可以使用一些日志库(log4cxx、log4cpp、Boost.Log、QDebug 等)。它们应该具有您需要的功能 - 例如,同时登录到控制台和文件。

解决方案dup2/ _dup2

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

Microsoft 示例的相关部分(已删除所有检查,请查看原始示例。我没有 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 );
}
于 2017-06-17T19:42:23.953 回答
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
      }
  }
于 2017-06-17T19:12:20.297 回答