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