我知道在控制台中执行程序时,可以指定一个可以保存控制台的输出文件。例如,在 Windows 中:
C:\>myprogram.exe > output.txt
但是,有没有办法通过代码建立,即以编程方式:1)控制台是否应该保存到文件中;和 2) 应保存输出的文件的名称(如果有)。
我知道我当然可以使用fprint
或std::cout
将每个字符串打印到文件中,就像我可以对控制台执行的操作一样。但出于性能考虑,我想知道是否可以通过代码确定整个控制台应保存到文件中。
我知道在控制台中执行程序时,可以指定一个可以保存控制台的输出文件。例如,在 Windows 中:
C:\>myprogram.exe > output.txt
但是,有没有办法通过代码建立,即以编程方式:1)控制台是否应该保存到文件中;和 2) 应保存输出的文件的名称(如果有)。
我知道我当然可以使用fprint
或std::cout
将每个字符串打印到文件中,就像我可以对控制台执行的操作一样。但出于性能考虑,我想知道是否可以通过代码确定整个控制台应保存到文件中。
您可以使用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 );
}
是的,您可以编写如下代码:
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
}
}