读取输入的字符串文本以创建2D矢量

时间:2018-10-15 16:46:59

标签: c++ algorithm stdvector

给出以下常规文本文件:

56789
28385
43285
22354
34255

我正在尝试读取文本文件中的每个字符串字符,并将它们存储在2D向量中。

首先,我想选择每个字符串行。然后,我想将行中的每个字符转换为int然后将push_back转换为行。然后,我想对每一行重复一次。

在我的2D向量中输出每一列和每一行时,我想要的是相同的精确输出:

56789 //each number an int now instead of a string
28385
43285
22354
34255

我的问题是我尝试使用出现错误的i = stoi(j);

No matching function for call to 'stoi'

我确实有正确的#include才能使用stoi()

vector<vector<int>> read_file(const string &filename) 
{
    string file, line; stringstream convert; int int_convert, counter;
    vector<vector<int>> dot_vector;

    file = filename;
    ifstream in_file;
    in_file.open(file);

    while (getline(in_file, line)) {
        counter++; //how many lines in the file
    }

    char current_char;
    while (getline(in_file, line)) {
        for (int i = 0; i < counter; i++) {
            vector<int> dot_row;
            for (int j = 0; j < line.size(); j++) {
                current_char = line[j];
                i = stoi(j); //this is giving me an error
                dot_row.push_back(i);
            }
            dot_vector.push_back(dot_row);
        }
    }

    in_file.close();
    return dot_vector;
}

1 个答案:

答案 0 :(得分:2)

这里

 i = stoi(j);
 // j is integer already

std::stoi     需要一个字符串作为参数,您提供的是int

您可以将字符转换为字符串,然后按如下所示调用std::stoi

std::string CharString(1, line[j]);
dot_row.emplace_back(std::stoi(CharString));

或可以直接将 char转换为int ,同时保持向量:

dot_row.emplace_back(static_cast<int>(line[j] - '0'));

您的代码中还有其他问题。就像提到的注释一样,您不需要额外的行数。一旦有了第一个while循环,您将到达文件的结尾。之后的代码将变得毫无意义。

第二,您不需要两个for loops。只需对每个line字符串使用基于范围的for循环,并在对其进行迭代时将其转换为整数并保存为vector。

while (getline(in_file, line)) 
{
    std::vector<int> dot_row; dot_row.reserve(str.size());
    for (const std::string& eachChar: line) 
    {
        std::string CharString(1, eachChar);
        dot_row.push_back(std::stoi(CharString));
        // or other option mentioned above
    }
    dot_vector.push_back(dot_row);
}