在此问题上,您的帮助会很重要。
我必须读取一个文本文件,该文本文件的向量中包含行和列。文本文件可以是任何大小。 文本文件的一个示例:
T,T,T,F,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
现在,如何将该文本文件上传到2D向量上?
到目前为止,我知道我必须使用向量的向量(2d向量),因此我将其初始化为:
vector<vector<char> > forest;
说实话,我不知道如何从这里前进。我假设我必须使用嵌套的for循环,但是我对2d向量没有太多练习。
我还考虑使用getline并将每一行读取为字符串,或使用.get函数并将每个字符视为while循环内的char?我是编码工作的新手,因此将不胜感激!
谢谢:)
答案 0 :(得分:1)
您可以使用getline
逐行将文件读取为字符串。对于您阅读的每个字符串,请遍历其字符以构建行向量以填充森林:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string line;
std::ifstream infile("file.txt");
std::vector<std::vector<char> > forest;
while (std::getline(infile, line)) {
std::vector<char> row;
for (char &c : line) {
if (c != ',') {
row.push_back(c);
}
}
forest.push_back(row);
}
for (std::vector<char> &row : forest) {
for (char &c : row) {
std::cout << c << ' ';
}
std::cout << '\n';
}
return 0;
}
输出:
T T T F T
T T T T T
T T T T T
T T T T T
T T T T T
T T T T T
T T T T T
答案 1 :(得分:0)
要解决诸如此类的编程问题,一种有效的方法是将其分解为较小的问题,并编写函数来解决每个问题。
在这个特定问题中,我们可以考虑按以下方式分解问题
,
字符)分隔每一行。std::vector<std::vector<char>>
。我们可以使用ifstream
和getline
,即,
#include <fstream>
#include <string>
std::vector<std::vector<char>> read_char_matrix(std::string const &filename) {
std::ifstream infile(filename);
for (std::string line; std::getline(infile, line); ) {
// Add stuff into a matrix
}
// Return the matrix
}
因此,通过提供一种读取文件内容的解决方案,我们现在可以考虑问题2。花一点时间来理解问题2实际上是一个独立的问题,只需要分解逗号即可。分隔的字符串。可以使用istringstream
通过分隔符来分割字符串。我们可以编写一个单独的函数来实现此目的,如下所示
#include <sstream>
#include <vector>
std::vector<char> split_on(std::string const &str, char delimiter) {
std::istringstream iss(str);
std::vector<char> split_str;
for (char c; iss >> c; ) {
split_str.emplace_back(c);
// Ignore delimiters
if (iss.peek() == delimiter)
iss.ignore();
}
return split_str;
}
最后,我们可以将其整合到以下解决方案中
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
std::vector<char> split_on(std::string const &str, char delimiter) {
std::istringstream iss(str);
std::vector<char> split_str;
for (char c; iss >> c; ) {
split_str.emplace_back(c);
// Ignore delimiters
if (iss.peek() == delimiter)
iss.ignore();
}
return split_str;
}
std::vector<std::vector<char>> read_char_matrix(std::string const &filename) {
std::ifstream infile(filename);
std::vector<std::vector<char>> matrix;
for (std::string line; std::getline(infile, line); ) {
matrix.emplace_back(split_on(line, ','));
}
return matrix;
}
然后可以使用文件名来调用函数read_char_matrix
,并将在std::vector<std::vector<char>>
中返回预期的矩阵。