非空格分隔文本文件到2D矢量

时间:2017-04-04 12:08:33

标签: c++

我有一个可以是任意大小的文件,并且是一系列char值之间没有任何空格(除了空格被视为网格的空白单元格)。

xxxxxxx
xx   xx
xxyyyxx

经过一些很好的帮助,我已经使用了vector<vector<char> >的方法,但我似乎无法填充它。

void readCourse(istream& fin) {

    // using 3 and 7 to match example shown above
    vector<vector<char> > data(3, vector<char>(7));

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 7; j++) {
            fin.get(data[i][j]); // I believe the problem exists here
        }                        // Does the .get() method work here?
    }                            // Or does it need to be .push_back()?

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 7; j++) {
            cout << data[i][j];
        }
    }
}

我填充2D矢量的方法有效吗?如果没有,你能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

解决方案我最终在ADT实施后使用

<div class="flex">
  <div class="grow-1">left sidebar</div>
  <div class="grow-1">content</div>
  <div class="grow-1">right sidebar</div>
</div>

答案 1 :(得分:0)

我使用单个vector<char>来保持简单高效:

vector<char> readCourse(istream& fin) {
    vector<char> course(3*(7+2)); // 3x7 plus newlines
    fin.read(course.data(), course.size());
    course.resize(fin.gcount());
    auto end = remove(course.begin(), course.end(), '\n');
    end = remove(course.begin(), end, '\r');
    course.erase(end, course.end()); // purge all \n and \r
    return course;
}

这是获取所有数据的单一输入操作,然后删除您不需要的字符。然后,您可以按照以下方式访问结果:

course.at(x + y*7) // assuming width 7

这可能看起来有点不方便,但它有效且紧凑 - 开销总是三个指针和一个堆分配,而不是与行数成比例。