Создание плоского файла из векторного массива

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

outFile << vec1[i] << "\t" << vec2[i] << endl;

  #include <fstream>
#include <vector>

using namespace std;
//int main()
void ffile()
{
    std::ofstream ofs;
    ofstream outFile;
    outFile.open("flatFile.dat");
     vector<int> vec1{ 10, 20 };
     vector<int> vec2{ 0, 20, 30 };


    for (int i=0; i<=3;i++)

{
  outFile << vec1[i] << "\t" << vec2[i] << endl;
    }
}

Обновленный вопрос: у меня есть два вектора с разным размером вектора. Будут ли проблемы, если я буду использовать размер большого вектора, выполняющего код?

Другое дело, что в плоском файле я не вижу двух столбцов, вместо этого я вижу только один столбец и записи, исходящие из вектора vec2[i] . Как иметь обе записи в первом столбце для vec1 и во втором столбце для vec2?


person user193422    schedule 27.11.2019    source источник
comment
Первая проблема: i<5 вместо этого используйте vec1.size()   -  person Damien    schedule 27.11.2019
comment
Ваш цикл for повторяется 5 раз, но ваши векторы содержат только 3 элемента. Итак, когда i ›=3, бум!   -  person acraig5075    schedule 27.11.2019
comment
Ваш (закомментированный) вывод выглядит нормально, но: как вы хотите вывести 5 значений, если vec1 и vec2 содержат только 3?   -  person Scheff's Cat    schedule 27.11.2019
comment
спасибо, обновил соответственно. И обновил вопрос.   -  person user193422    schedule 27.11.2019
comment
Ваша программа рухнет, если вы перейдете к размеру большего массива.   -  person acraig5075    schedule 27.11.2019
comment
Примечание: если вам нужно хорошее форматирование и если целые числа могут иметь совершенно разные значения, использования вкладки \t может быть недостаточно. Посмотрите на std::setw   -  person Damien    schedule 27.11.2019


Ответы (1)


C++ не позволяет читать из вектора за его последним элементом. Полная остановка. Если вы используете метод at, вы получите исключение out_of_range, а с оператором [] вы просто получите неопределенное поведение.

Это означает, что вам придется проверить размер вектора. Ваш код может стать:

#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;
//int main()
void ffile()
{
    // std::ofstream ofs;     // unused 
    ofstream outFile;
    outFile.open("flatFile.dat");
    vector<int> vec1{ 10, 20 };
    vector<int> vec2{ 0, 20, 30 };

    // use the sizes of both vectors to compute the loop limit
    for (unsigned i = 0; i <= std::max(vec1.size(), vec2.size()); i++)

    {
        if (i < vec1.size()) outFile << vec1[i];  // only output actual values
        outFile << "\t";
        if (i < vec2.size()) outFile << vec2[i];
        outFile << endl;
    }
}

Этот код должен дать текстовый файл, похожий на:

0   0
20  20
    30

(это было в моих тестах...)

person Serge Ballesta    schedule 27.11.2019
comment
ofs не используется - person acraig5075; 27.11.2019
comment
@ acraig5075: ты прав. Я забыл прокомментировать это в своем коде. Сейчас. Спасибо, что заметили. - person Serge Ballesta; 27.11.2019