Недавно я обнаружил, что вы можете сохранить вывод консоли из программы на C ++ в текстовый файл с помощью Visual Studio (добавив «> output.txt» в аргументах команды в свойствах вашего проекта).
Проблема в том, что я хочу, чтобы выходные данные отображались как внутри выходного файла, который я создаю, так и в командной консоли, для упрощения отладки (после сохранения вывода в файл он больше не отображается на консоли). Есть ли возможность включить обе эти функции в Visual Studio или что-то подобное?
Вы можете добиться отправки данных нескольким получателям при выводе, используя пользовательский поток. Их легко создать, создав подходящий буфер потока. Например:
#include <fstream>
#include <iostream>
#include <ostream>
#include <streambuf>
class teebuf
: public std::streambuf {
std::streambuf* d_sbuf1;
std::streambuf* d_sbuf2;
public:
teebuf(std::streambuf* sbuf1, std::streambuf* sbuf2)
: d_sbuf1(sbuf1), d_sbuf2(sbuf2) {
}
int overflow(int c) {
if (c != std::char_traits<char>::eof()) {
this->d_sbuf1->sputc(c);
this->d_sbuf2->sputc(c);
}
return std::char_traits<char>::not_eof(c);
}
};
int main() {
std::ofstream out("foo.txt");
teebuf tb{out.rdbuf(), std::cout.rdbuf()};
std::streambuf* coutbuf = std::cout.rdbuf(&tb);
std::cout << "hello world! (to both the console and the file)\n";
std::cout.rdbuf(coutbuf); // needs to be replaced as it gets used to flush
}
Конечно, это навязчивый подход, который требует изменения источника. Я не использую MSVC ++ и не могу прокомментировать, есть ли способ сохранить стандартный вывод в файл.
Вы можете добиться этого с помощью команды тройник
Предполагая, что у вас есть исполняемый файл (не имеет значения, реализован ли он в C ++ или нет) с именем myExe, Вы можете сделать следующее:
./myExec | tee output.txt
Если вы хотите добиться этого в Visual Studio, измените > output.txt
с одним из следующих
1. Работа на Linux:
| tee output.txt
2. Работа на Windows:
> output.txt && type output.txt