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

现在,如何将此文本文件上传到 2D 矢量?

到目前为止,我知道我必须使用向量的向量(2d 向量),所以我像这样初始化它:

vector<vector<char> > forest;

老实说,我不知道如何从这里前进。我会假设我必须使用嵌套的 for 循环,但我对 2d 向量没有太多练习。

我还在考虑使用 getline 并将每一行作为字符串读取,或者使用 .get 函数并将每个字符视为 while 循环中的字符?我是编码工作的新手,所以任何帮助都将不胜感激!

谢谢 :)

4

2 回答 2

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
于 2019-06-12T03:58:43.060 回答
0

要解决这样的编程问题,一种有效的方法是将其分解为更小的问题并编写函数来解决每个问题。

在这个特定的问题中,我们可能会考虑将问题分解如下

  1. 逐行读取文件的内容。
  2. 用一些分隔符分隔每一行,在这种特殊情况下,,字符。
  3. 将此结果存储在输出数据结构中,即std::vector<std::vector<char>>.

我们可以编写一个函数来解决问题 1,而不是简单地在 C++ 中使用ifstreamand 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>>

于 2019-06-12T04:29:48.380 回答