首页 > 解决方案 > 如何创建 std::ofstream 的向量并将流写入不同的文本文件

问题描述

std::vector我只是想使用of std::ofstreams将一些数字写入几个不同的文件。我的程序正在编译和运行,文件正在生成,但我的文件中没有文本。

#include <iostream>
#include <fstream>
#include <vector>

int main()
{

    auto num_components = 3;
    std::vector<std::ofstream> files_to_be_written;
    files_to_be_written.resize(num_components);

    for (auto i = 0; i < num_components; ++i){
      std::string file_name = "text" + std::to_string(i) + ".txt";
      files_to_be_written.emplace_back(std::ofstream{ file_name });
    }

    std::vector<std::vector<int>> data_to_be_written;
    data_to_be_written.resize(num_components);
    data_to_be_written[0].push_back(1);
    data_to_be_written[0].push_back(2);
    data_to_be_written[0].push_back(3);
    data_to_be_written[1].push_back(4);
    data_to_be_written[1].push_back(5);
    data_to_be_written[1].push_back(6);
    data_to_be_written[2].push_back(7);
    data_to_be_written[2].push_back(8);

    for (auto& it : data_to_be_written)
    {
        auto idx = &it - &data_to_be_written[0];
        for (auto i = it.begin(); i != it.end(); ++i)
        {
            files_to_be_written[idx] << *i << "\n";
        }
    }

    for (auto i = 0; i < num_components; ++i){
        files_to_be_written[i].close();
    }
}

我不确定我在哪里犯了错误。

标签: c++stringstream

解决方案


auto num_components = 3;
std::vector<std::ofstream> files_to_be_written;
files_to_be_written.resize(num_components);

由于您在这里调用,这将在向量中std::vector::resize()创建三个新的空元素。然后使用文件路径std::ofstream将另外三个std::ofstream对象附加到向量的后面。std::vector::emplace_back()您最终在向量中有 6 个元素。

问题是你只写std::ofstream这段代码的前三个元素:

for (auto& it : data_to_be_written)
{
    auto idx = &it - &data_to_be_written[0];
    for (auto i = it.begin(); i != it.end(); ++i)
    {
        files_to_be_written[idx] << *i << "\n";
    }
}

解决方案很简单。代替

files_to_be_written.resize(num_components);

files_to_be_written.reserve(num_components);

std::vector::reserve()不会向向量添加任何新元素,而只是为它们分配内存。


推荐阅读