Записать векторные значения в несколько файлов одновременно в C ++ - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть данные в моем векторе. Я пытаюсь записать каждое значение вектора, скажем vector_name [0] в "examplezero.h", vector_name [1] в "exampleone.h" и так далее. Приведенный ниже код показывает, как я создал файлы.

int co = 80;
string name ="example";
std::ofstream output_file[80];
for (int i = 0; i < co; i++)
{
     output_file[i].open(name + std::to_string(i) + ".h");
     output_file[i].close();
}

Я пытаюсь выполнить итерацию по моему вектору и пытаюсь записать в мои файлы.

std::vector<string> rowname;  //This has all the values
    for (auto i = rowname.begin(); i != rowname.end(); ++i) 
    {

        std::ostream_iterator<std::string> \
                           output_iterator(output_file[80], "\n");
        std::copy(rowname.begin(), rowname.end(), output_iterator);

    }

Когда я пытаюсь запишите в файлы, что он падает. Можете ли вы дать мне знать, что не так? Я знаю основы C ++ и пытаюсь изучить продвинутые концепции. Спасибо

1 Ответ

1 голос
/ 18 февраля 2020

Ваша программа, вероятно, аварийно завершает работу, потому что вы написали этот код:

std::ostream_iterator<std::string> \
                           output_iterator(output_file[80], "\n");

... и output_file[80] - это один элемент после конца массива. Вы объявили это как:

std::ofstream output_file[80];

Первый элемент этого массива - output_file[0], а последний элемент этого массива - output_file[79].

Есть и другие неправильные вещи

Как указывал @walnut, если ваш код действительно такой, как вы его опубликовали, то, похоже, он закрывает каждый файл сразу после его открытия, ничего не записывая в файл.

for (int i = 0; i < co; i++)
{
     output_file[i].open(name + std::to_string(i) + ".h");
     output_file[i].close(); // Leaving so soon?
}

Запись в файл Закрытый ofstream не создает программу sh, но устанавливает условие ошибки для ofstream (badbit). Так что для вас это будет тихая ошибка.

Чтобы исправить

Чтобы исправить вашу проблему, вам нужно будет записать в свой файл после того, как вы откроете его, но перед тем, как закрыть его.

Вам также нужно будет решить, в какой именно выходной файл вы хотите записать, и предоставить правильный индекс массива. Из вашего примера кода не совсем понятно, каково было ваше намерение. Вам нужно решить, в какой файл (ы) (из 80, которые вы открыли) вы хотите записать каждый элемент вашего rowname вектора.

std::copy в том виде, как вы написали, он напишет все строки в векторе rowname в одном потоке. Если вы намеревались записать каждый элемент в отдельный файл, то вам придется настроить его существенно по-разному.

Что-то еще в следующем виде:

#include <fstream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> rowname = { "alpha", "bravo", "charlie" }; // example data
    std::string name = "example"; // base filename

    for (size_t i = 0; i < rowname.size(); ++i) {
        std::ofstream output_file;
        std::string filename = name + std::to_string(i) + ".h"; // e.g.: "example0.h"
        output_file.open(filename);
        output_file << rowname[i]; // write the string to the file
        output_file.close(); // if you want
    }
}

Это записывает текст alpha в example0.h , bravo в example1.h и charlie в example2.h .

...