Устанавливая с помощью кода, должна ли консоль быть сохранена в файл (и имя такого файла)

Я знаю, что когда программа выполняется в консоли, можно указать выходной файл, в котором можно сохранить консоль. Например, в Windows:

C:\>myprogram.exe > output.txt

Однако есть ли способ установить с помощью кода, то есть программно: 1) должна ли консоль быть сохранена в файл; и 2) имя файла, в который должны быть сохранены выходные данные, если таковые имеются.

Я знаю что могу конечно использовать fprint или же std::cout чтобы напечатать каждую строку в файл, то же самое я могу сделать для консоли. Но ради производительности я хотел бы знать, можно ли с помощью кода установить, что вся консоль должна быть сохранена в файл.

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
}
}
0

Другие решения

Ты можешь использовать 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 );
}
0

По вопросам рекламы [email protected]