将ASCII文本文件解析为Char的2d矢量

时间:2018-11-07 19:18:46

标签: c++ parsing vector

我需要帮助,我试图读取一个看起来像这样的文件:

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

我需要将其解析为chars的2d向量,以便稍后可以对其进行修改。

到目前为止,我想出的是

#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 :(得分:0)

您需要在向量中保留空间,然后才能通过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 . . . . 
. . . . . . . . . 
. . . . . . . . . 
. . . . . . . . . 
. . . . . . . . . 

答案 1 :(得分:0)

使用std::getlinestd::string可以使生活更轻松:

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

可以使用数组符号访问std::string