2016-07-25 12 views
1

私はC++を学んでおり、セグメンテーションフォルトに問題があります。私のプロジェクトでは、Fileからcharの2d Vectorに読み込みたいと思っています。 ベクターは、これは私の読み取りファイル機能とpush_backによってデバッガ(私はGDBを使用)と言うでセグメンテーションフォールトであるstd::vector<std::vector<char>> gamearea;2dベクトルのpush_backのセグメンテーションフォルト

void Structure::readFile(const std::string filename) 
{ 
    std::ifstream file(filename.c_str()); 
    if (!file.is_open()) 
    { 
     std::cerr << "Error opening file: " << filename << std::endl;  
     exit(1); 
    } 
    std::string line; 
    int i = 0; 
    while (true) 
    { 
     std::getline(file, line); 
     if (file.eof()) 
     { 
      break; 
     } 
     for (size_t j = 0; j< line.length(); j++) 
     { 
      gamearea[i].push_back(line[j]); 
     } 
     i++; 
    } 
} 

です。

誰かが私を助けることができますか?私は問題を見つけることができません。あなたは、まず、第1ベクターにプッシュバックする必要が

+2

'gameArea [i] .push_back(行[j])'これを 'gameArea.at(i).push_back(行[j])'に変更します。 'out_of_range'例外が発生します。つまり、 'i'は無効なインデックスであるため、' gameArea [i] 'はありません。 – PaulMcKenzie

+0

私は無効なインデックスで、何を変更する必要があるのか​​説明できますか?ゲームエリアの行をベクタに保存したい、他の機能では、図やボックスのようなゲーム内のものの正確な位置が必要です。私は行と一緒に私は言うことができると思ったとライン[j]は、文字の行と列を知るようにベクトルの文字を保存します。 – Lisa

答えて

3

std::vector<char>デフォルトでgameareaベクトルは空であるので、gameareaにアクセスする際

(gameareaは、その内部の0の要素を持っているので)[i]は、あなたが範囲外にアクセスしてしまうので、ここで
void Structure::readFile(const std::string filename) 
{ 
std::ifstream file(filename.c_str()); 
if (!file.is_open()) { 
std::cerr << "Error opening file: " << filename << std::endl; exit(1); 
} 
std::string line; int i = 0; 
while (true) { 
    std::getline(file, line); 
    if (file.eof()) { break; } 

    // NOTICE HERE 
    // We add a new vector to the empty vector 
    std::vector<char> curArea; 
    gamearea.push_back(curArea); 


    for (size_t j = 0; j< line.length(); j++) { 
     gamearea[i].push_back(line[j]); 
    } 
    i++; 
    } 
} 
+0

もう一度セグメンテーションフォールトは存在しませんが、Vectorには何も保存されません。このベクターにファイルの内容を保存する何かを忘れていますか? – Lisa

+0

どのベクトルは保存されませんか?あなたは確かにjが増加していますか? – MichaelCMS

+0

そうだと思います。しかし、私はデバッガでstd :: vectorの後に見た。 curArea;このようなものが起こった '305 \t std :: vector curArea; (GDB)ステップ のstd ::ベクトル<チャー、スタンダード::アロケータ> /usr/include/c++/4.9/bits/stl_vector.h:257 で::ベクトル(これは0x7fffffffe1a0 =):_基本( ){} (GDB)ステップ のstd :: _ Vector_base <チャー、スタンダード::アロケータ> :: _ Vector_base(これは= 0x7fffffffe1a0) /usr/include/c++/4.9/bits/stl_vector.h:125 125で\t:_M_impl(){} 'これは、forループにはないことの間に何がわかるのか分かりません。 – Lisa

0

は、それが空であることを考えると、適切に読んで、あなたのベクトルを更新する例です:

void Structure::readFile(const std::string filename) 
{ 
    std::ifstream file(filename.c_str()); 
    if (!file.is_open()) { 
     std::cerr << "Error opening file: " << filename << std::endl; 
    return; 

    std::string line; 
    while (std::getline(file, line)) 
     gamearea.push_back(std::vector<char>(line.begin(), line.end())); 
} 

Live Example

eof()をテストする必要はありません。また、2つのイテレータをとる2つの引数std :: vectorコンストラクタを使用して、データの文字列全体をpush_backと呼び出すだけです。

+0

私はそれがうまくいくと思いますが、私のshow()関数がMainで呼び出され、デバッガに次のようなときに私のコンソールにその領域が表示されませんでした: 'std :: vector > ::ベクトル<__ gnu_cxx :: __ normal_iterator 、void>( this = 0x7fffffffe1c0、__first = 35 '#'、__last = 0 '\ 000'、__a = ...) /usr/include/c++/4.9/bits/stl_vector.h:403 \t:_Base(__ a) 'が起こり、ここで何が起こっているのかわかりません。私は実際にデバッガを理解するのに慣れていません。 – Lisa

+0

私の例を見てください。入力が読み込まれ、gamearea 2d vectorに正しく割り当てられています。 – PaulMcKenzie

関連する問題