给出以下常规文本文件:
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;
}
答案 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);
}