Как мне прочитать текстовый файл в 2D вектор? - PullRequest
0 голосов
/ 12 июня 2019

Ваша помощь будет оценена в этом вопросе.

Мне нужно прочитать текстовый файл, в котором есть строки и столбцы в векторе. Текстовый файл может быть любого размера. Один пример текстового файла:

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<vector<char> > forest;

Если честно, я не знаю, как двигаться дальше отсюда. Я бы предположил, что я должен использовать вложенный цикл for, но у меня нет особой практики с 2d векторами.

Я также думал об использовании getline и считывании каждой строки как строки или использовании функции .get и рассматривал каждый символ как символ в цикле while? Я новичок в программировании, поэтому любая помощь будет оценена!

Спасибо:)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Вы можете использовать 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
0 голосов
/ 12 июня 2019

Для решения таких проблем программирования, как эта, эффективный подход состоит в том, чтобы разбить ее на более мелкие задачи и написать функции для решения каждой из них.

В этом конкретном вопросе мы могли бы рассмотреть решение этой проблемы следующим образом

  1. Читать содержимое файла, строка за строкой.
  2. Разбейте каждую строку некоторым разделителем, в данном случае - символом ,.
  3. Сохранить этот результат в структуре выходных данных, т.е. std::vector<std::vector<char>>.

Мы можем написать функцию для решения задачи 1, довольно просто в C ++, используя 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>>.

...