Неисправность форматирования выходного потока с неизвестной силой и длиной int - PullRequest
0 голосов
/ 02 апреля 2019

Я заканчиваю этот проект c ++, над которым я работаю, чтобы получить пользовательский ввод, вычислить некоторые значения, а затем записать все данные в файл.Моя проблема в том, что я не могу получить значения для правильного выравнивания в текстовом файле.Я использую setw (), но это не правильно выравнивает все, когда длина пользовательского ввода неизвестна.Он просто портит столбцы и делает их не выровненными.

Я пытался использовать оператор фиксированного значения, выравнивание по левому краю, выравнивание по правому краю, без особой удачи

Вот мой код, относящийся к записи в файл.

if (myfile.is_open()){
    myfile << "BASKETBALL COURTS AREA REPORT\n\n";
    myfile << "Court" << setw(25) << "Height" << setw(25) << "Width\n";
        for(int i=0; i<n; i++){
            myfile << names[i] << setw(25) << " " << arr1[i] << setw(25) << arr2[i] <<"\n\n";
        }
      }
   myfile << "\nThe largest court is " << maxName << ": " << maximum << "\n" << "\n";
   myfile << "Total area covered by all courts: " << totalArea;

Я ожидаю, что столбцы будут полностью выровнены, как на этом рисунке:

Однако фактический результат выглядит больше так:

Если бы кто-нибудь мог помочь мне с тем, что делать, я был бы очень признателен.Большое вам спасибо за ваше время!

1 Ответ

1 голос
/ 02 апреля 2019

Первая (самая очевидная) проблема заключается в том, что вы не устанавливаете ширину поля для названия суда.По умолчанию установлено значение 0, поэтому каждое имя печатается с минимальной шириной, необходимой для отображения всего имени.Задание ширины других столбцов после этого мало что дает.

Чтобы задать ширину, вы, вероятно, захотите просмотреть элементы, найти самый широкий, а затем добавить несколько дополнительных пробелов, чтобы получить поле междустолбцы.

#include <iostream>
#include <sstream>
#include <iomanip>
#include <ios>
#include <string>
#include <algorithm>
#include <vector>

struct court { 
    std::string name;
    int height;
    int width;
};

int main() { 
    std::vector<court> courts { 
        { "Auburn park", 12, 16},
        { "Alabama", 14, 17},
        {"Wilsonville Stadium", 51, 123}
    };

    auto w = std::max_element(courts.begin(), courts.end(), [](court const &a, court const &b) { return a.name.length() < b.name.length(); })->name.length();

    for (auto const &c : courts) { 
        std::cout << std::left << std::setw(w+5) << c.name 
                  << std::right << std::setw(5) << c.height
                  << std::setw(5) << c.width << "\n";
    }
}

Результат:

Auburn park                12   16
Alabama                    14   17
Wilsonville Stadium        51  123
...