【问题标题】:Inserting numbers from file into vector<vector<int>>将数字从文件插入向量<vector<int>>
【发布时间】:2018-06-24 02:58:50
【问题描述】:

我想将每一行插入向量中。

我的文件如下所示:

问题是在 getline 中使用多个分隔符。 我的代码如下所示:

vector<int>czytajplik()
{
string line;
vector<string> text;
ifstream mojplik;
vector<vector<int>> zajecia;


mojplik.open("dane.txt");
if (mojplik.is_open())
{
    while (getline(mojplik, line))
    {

        while (getline(mojplik, line, ' '))
        {
            text.push_back(line);
        }
    }
    mojplik.close();
}

else cout << "Unable to open file" << endl;


vector<int> textnumery;
for (int i = 0; i <text.size(); i++)
{
    int num = atoi(text.at(i).c_str());
    textnumery.push_back(num);
}
return textnumery;

}

【问题讨论】:

  • 欢迎来到stackoverflow。请澄清您的问题!
  • 那些外来变量名肯定很烦人!但主要问题是这个问题看起来太像“调试我的代码”了。好吧,如果我仍然至少可以提供一点帮助,那么嵌套的两个 while 将不起作用(基本上,您将丢弃第一行,然后读取第二行的第一个数字,依此类推)。您可以实现(我假设)您想要的一种方法是使用 stringstreams:ideone.com/6Ct1U7 另一种方法是读取一个又一个字符并编写自己的自动机我猜,可能还有其他更简单的方法
  • 您可以使用How can I read and parse CSV files in C++ 的解决方案,只需将逗号替换为空格即可。

标签: c++ vector std fstream getline


【解决方案1】:

我想这就是你的要求:

std::ifstream mojplik{"dane.txt"};
if (mojplik.is_open()) {

    std::vector<std::vector<int>> numbersLines{};

    for (std::string line; getline(mojplik, line);) {
        std::vector<int> numbersLine{};
        std::istringstream is(line);
        int num;
        while (is >> num) {
            numbersLine.push_back(num);
        }
        numbersLines.push_back(numbersLine);
    }
    mojplik.close();
}

【讨论】:

    【解决方案2】:

    我会假设你的数据看起来像

    1 2 3 4 5

    6 7 8 9 10

    11 12 13 14 15

    并希望有一个等于

    的二维向量
    vector<vector<int>> result = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 } };
    

    然后你想要类似的东西

    vector<vector<int>> zajecia;
    ifstream mojplik("dane.txt");
    if (mojplik.is_open())
    {
        for (string line; getline(mojplik, line); )
        {
            stringstream numbers_stream(line);
            vector<int> numbers;
            for (int number; numbers_stream >> number; )
            {
                numbers.push_back(number);
            }
            zajecia.push_back(numbers);
        }
        mojplik.close();
    }
    

    【讨论】:

    • 请注意,您可以将内部循环的主体压缩为stringstream numbers_stream(line); zajecia.emplace_back( istream_iterator&lt;int&gt;( numbers_stream ), istream_iterator&lt;int&gt;() );,但我选择限制我对您原始代码所做的更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2023-04-03
    相关资源
    最近更新 更多