0

数字のグリッドの大きなファイル (50x11k) があります。私がやろうとしているのは、値をベクトルに配置して、異なる行の値に同時にアクセスできるようにすることだけです。毎回セグフォルトが発生します (while ループの前に cout を実行することさえできません)。誰もが問題を見ますか?

これを行う簡単な方法があれば、私に知らせてください。ファイルが大きく、ある行の値を別の行と比較できるようにする必要があるため、単純な getline が機能しません。ファイルをジャンプして行を「つかむ」のではなく、単に「調べる」方法はありますか?その番号を入力して同じ行を調べて後で戻ることができるようにするには?大きな配列のようにファイルを見るのが好きですか?3 行目とその行の 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;
}
4

2 に答える 2

2
    vector<vector<string> > grid;

これは、要素のない空のベクターを宣言します。

        c = grid[column][row];

これはベクトルの要素にアクセスしますが、要素はありません。

vector::at()代わりに使用するように変更すると、次のvector::operator[]ようになります。

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

次に、範囲外にアクセスしていることを示す例外が発生します。

それらにアクセスする前に、ベクターに要素を設定する必要があります。1 つの方法は、適切な数の要素を前もって宣言することです。

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

おそらく IO ループも修正したいでしょう!in.eof()。通常、テストは間違っています。1 文字ずつ読むのではなく、一度に 1 行ずつ読んで行を分割してみませんか?

while (getline(in, c))
于 2012-10-18T00:19:02.933 に答える
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!
于 2012-10-18T00:30:11.693 に答える