Дублирование вывода 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 раза - три лишних вывода

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


Ответы (0 шт):