Разбор текстового файла ASCII в 2d Vector of Char's - PullRequest
0 голосов
/ 07 ноября 2018

Мне нужна помощь, я пытаюсь прочитать файл, который выглядит примерно так:

.........
.........
.........
.........
....X....
.........
.........
.........
.........

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

То, что я до сих пор придумываю, это

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
//look up line by line parsing
using namespace std;
int main(int argc, char* argv[]) {
    vector<vector<char>> data;
    ifstream myReadFile;
    myReadFile.open("input1.txt");

    for (int i = 0; i < data.size(); i++) {
        int c = 0;
        char currentchar;

        while (!myReadFile.eof()) {
            data[i][c] = currentchar;
            c++;
            currentchar = myReadFile.get();
        }
    }

    //for ()


    myReadFile.close();


    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете сделать жизнь проще, используя std::getline и std::string:

std::string row_text;
std::vector<std::string> grid;
while (std::getline(myReadFile, row_text))
{
  grid.push_back(row_text);
}

К std::string можно получить доступ, используя обозначение массива.

0 голосов
/ 07 ноября 2018

Вам нужно зарезервировать пространство в векторе, прежде чем присваивать ему значения через data[i][c] = currentchar;. Но, вероятно, трудно зарезервировать место, прежде чем читать содержимое.

Более простым способом было бы использовать возможности динамического роста векторов (т. Е. push_back) и использовать std::string в качестве содержимого строки, поскольку вы можете легко читать полными строками. Вы по-прежнему можете получить доступ / изменить содержимое, а затем через data[i][c] = currentchar;. Смотрите следующий код, иллюстрирующий это:

#include <sstream>
#include <iostream>
#include <vector>

int main() {

    const char* fileContent = R"foo(.........
.........
.........
.........
....X....
.........
.........
.........
.........)foo";

    std::vector<std::string> lines;
    stringstream ss(fileContent);
    string line;
    while (getline(ss,line)) {
        lines.push_back(line);
    }

    lines[2][5] = 'Y';

    for (auto line : lines) {
        for (auto c : line) {
            cout << c << " ";
        }
        cout << endl;
    }
}

Выход:

. . . . . . . . . 
. . . . . . . . . 
. . . . . Y . . . 
. . . . . . . . . 
. . . . X . . . . 
. . . . . . . . . 
. . . . . . . . . 
. . . . . . . . . 
. . . . . . . . . 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...