C ++:大型多维向量导致seg错误

时间:2012-10-18 00:15:39

标签: c++ vector segmentation-fault

我有一个数字网格的大文件(50x11k)。我想要做的就是将值放入向量中,以便我可以同时访问不同行的值。我每次都会得到一个seg错误(我甚至不能在while循环之前做一个cout)。有谁看到这个问题?

如果有更简单的方法,请告诉我。它是一个大文件,我需要能够将一行的值与另一行进行比较,因此一个简单的getline不起作用,有没有办法跳转文件而不是“抓住”这些行,而只是“检查”我可以稍后通过输入那个数字来检查同一行吗?喜欢像大阵列一样看文件?我想看看那一行中的第三行和第5个字符,同时我看第56行和第9个字符,就像那样。

#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

//int g_Max = 0;

int main() {

    vector<vector<string> > grid;

    ifstream in("grid.txt");
    int row = 0;
    int column = 0;
    string c;

    if (!in) {
        cout << "NO!";
    }

    while (!in.eof()) {
        c = in.get();
        if ( c.compare("\n") == 0) {
            row++;
            column = 0;
        }
        else {
            c = grid[column][row];
            cout << grid[column][row];
            column++;
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

    vector<vector<string> > grid;

这声明了一个空的向量,没有元素。

        c = grid[column][row];

这可以访问向量的元素,但没有元素。

如果您将其更改为使用vector::at()而不是vector::operator[],请执行以下操作:

        c = grid.at(column).at(row);

然后你会得到例外,告诉你你的访问范围超出范围。

您需要先使用元素填充矢量,然后才能访问它们。一种方法是预先用正确数量的元素声明它:

    vector<vector<string> > grid(11000, std::vector<string>(50));

您可能还想修复IO循环,测试!in.eof()通常是错误的。为什么不一次读一行并分割线,而不是读单个字符?

while (getline(in, c))

答案 1 :(得分:0)

如果您只需要一次访问所有行,为什么不将其声明为std::vector<std::string>并且每行都是string ??

std::string s;
std::vector<std::string> lines;
while( std::getline(in, s) ) lines.push_back( s );
std::cout << "File contain " << lines.size() << " line" << std::endl;
std::cout << "Char at [1][2] is " << lines[1][2] << std::endl; // assume [1][2] is valid!