Дублирование вывода stdout в интегрированном терминале vs code. C++
Уважаемое сообщество разработчиков, обращаюсь к Вам, потому что chatGPT не разобрался с моей проблемой и отправил к вам)
P.S. Код программы приведу в самом конце.
Описание:
Есть программа на ЯП C++. Её суть - это чтение сырых данных из файла, какая-то обработка и вывод форматированного результата. Для удобства добавляю system("clear"); в код, чтобы вывод был более читаемым. Непосредственно в самой среде разработки VS Code использую расширение CMake tools от Microsoft.
Суть проблемы:
Когда использую в своей программе system("clear"); и несколько раз перезапускаю программу через СMake: запуск выбранного целевого объекта в окне терминала: [main] у меня выводится помимо вывода программы ещё и кусок предыдущего вывода (причём эффект накопительный, n раз запущу программу и n-1 лишних кусков вывода будет в терминале. Причём если убрать system("clear"); из кода программы, то такой проблемы не наблюдается. Терминал, конечно, не очищается, но ничего не наслаивается.
4 запуска программы - три лишних обрубка таблички.
Вот сам код программы, скидываю целиком кусок, с которого начались проблемы, потому что проблемное место своими силами найти не удалось. Также хочется добавить, что при запуске программы через внешний терминал.app MacOs такой проблемы нет (./main работает корректно, сколько раз не вызывай команду)
#include <cstdio>
#include <fstream>
#include <iostream>
#include <regex>
#include <vector>
#include <format>
using namespace std;
typedef long double LDval;
struct Data {
Data(std::vector<LDval> &measures, uint &tetta, uint &confidence_interval);
std::vector<LDval> _measures;
uint _tetta;
uint _confidence_interval;
friend std::ostream &operator<<(std::ostream &os, const Data &rhs);
}; // struct Data
Data::Data(std::vector<LDval> &measures, uint &tetta,
uint &confidence_interval)
: _measures(measures), _tetta(tetta),
_confidence_interval(confidence_interval) {}
std::ostream &operator<<(std::ostream &os, const Data &rhs) {
constexpr int width{60};
std::string str{
std::format("{:^{}}\n{:_^{}}\n", "Исходные данные", width, "", width)};
str += std::format("{:^{}}\n", "Результаты измерений:", width);
for (size_t i = 0; i < rhs._measures.size(); ++i) {
str += std::format("{:<{}}{:>{}}\n", i + 1, width / 2, rhs._measures[i],
width / 2);
}
str += std::format("{:_^{}}\n", "", width);
str +=
std::format("{:<{}}{:>{}}\n", "Инструментальная погрешность:", width / 2,
static_cast<long double>(rhs._tetta) / 100, width / 2);
str += std::format("{:<{}}{:>{}}\n{:_^{}}\n",
"Доверительная вероятность: ", width / 2,
static_cast<long double>(rhs._confidence_interval) / 100,
width / 2, "", width);
os << str;
return os;
}
class Parser {
public:
Parser() = default;
~Parser();
static void
openFile(std::string path = std::filesystem::current_path().string() +
"/file.txt");
static void closeFile();
static Data parsing();
private:
static inline std::ifstream _file{};
};
Parser::~Parser() {
if (_file.is_open())
_file.close();
}
void Parser::openFile(std::string path) {
if (_file.is_open())
_file.close();
_file.open(path);
if (!_file.is_open()) {
std::cerr << "Ошибка открытия файла\n";
exit(0);
}
}
void Parser::closeFile() {
if (_file.is_open())
_file.close();
}
Data Parser::parsing() {
std::vector<LDval> vec;
vec.reserve(100);
unsigned pd_value;
unsigned tetta_value;
LDval r_value;
std::regex x_regex("([-+]?\\d+\\.\\d+)");
std::regex pd_regex("pd: (\\d+)");
std::regex r_regex("r: (\\d+)");
std::regex tetta_regex("t: (\\d+)");
std::string line;
while (std::getline(_file, line)) {
std::cmatch match;
if (std::regex_search(line.c_str(), match, r_regex)) {
r_value = std::stold(match[1]);
} else if (std::regex_search(line.c_str(), match, pd_regex)) {
pd_value = std::stoi(match[1]);
} else if (std::regex_search(line.c_str(), match, tetta_regex)) {
tetta_value = std::stoi(match[1]);
} else {
auto itBegin = std::sregex_iterator(line.begin(), line.end(), x_regex);
auto itEnd = std::sregex_iterator();
for (auto x = itBegin; x != itEnd; ++x) {
vec.emplace_back(std::stold(x->str()));
}
}
}
return Data(vec, tetta_value, pd_value);
}
int main() {
system("clear");
Parser::openFile();
Parser parser;
Data ptr = parser.parsing();
Parser::closeFile();
std::cout << std::endl << ptr << std::endl;
return 0;
}
Также прикрепляю конфигурацию CMakeLists.txt:
cmake_minimum_required(VERSION 3.28)
project(smpltest)
set(CMAKE_CXX_STANDARD 20)
add_executable(main main.cpp)
Компилятор использую Homebrew Clang 17.0.6_1