Я знаю, что когда программа выполняется в консоли, можно указать выходной файл, в котором можно сохранить консоль. Например, в Windows:
C:\>myprogram.exe > output.txt
Однако есть ли способ установить с помощью кода, то есть программно: 1) должна ли консоль быть сохранена в файл; и 2) имя файла, в который должны быть сохранены выходные данные, если таковые имеются.
Я знаю что могу конечно использовать fprint
или же std::cout
чтобы напечатать каждую строку в файл, то же самое я могу сделать для консоли. Но ради производительности я хотел бы знать, можно ли с помощью кода установить, что вся консоль должна быть сохранена в файл.
Да, вы можете написать код так:
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
}
}
Ты можешь использовать dup2
функция (в окнах _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 );
}