如何将文本文件读入 2D 矢量?

How do I read a text file into a 2D vector?

本文关键字:2D 矢量 文件 文本      更新时间:2023-10-16

我必须将一个包含行和列的文本文件读入向量。文本文件可以是任意大小。 文本文件的一个示例:

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循环中的字符?

您可以使用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. 逐行读取文件的内容。
  2. 用一些分隔符(在本例中为,字符)分解每行。
  3. 将此结果存储在输出数据结构中,即std::vector<std::vector<char>>.

我们可以编写一个函数来解决问题 1,很简单地用 C++ 来,使用ifstreamgetline,即

#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>>中返回预期的矩阵。