如何将文本文件读取为2D向量?

时间:2019-06-12 03:15:15

标签: c++ string vector char 2d-vector

在此问题上,您的帮助会很重要。

我必须读取一个文本文件,该文本文件的向量中包含行和列。文本文件可以是任何大小。 文本文件的一个示例:

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?我是编码工作的新手,因此将不胜感激!

谢谢:)

2 个答案:

答案 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)

要解决诸如此类的编程问题,一种有效的方法是将其分解为较小的问题,并编写函数来解决每个问题。

在这个特定问题中,我们可以考虑按以下方式分解问题

  1. 逐行读取文件内容。
  2. 用某些定界符(在本例中为,字符)分隔每一行。
  3. 将此结果存储在输出数据结构中,即std::vector<std::vector<char>>

我们可以使用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>>中返回预期的矩阵。