web-dev-qa-db-ja.com

C ++ vector :: _ M_range_checkエラー?

これが私の機能です:

void loadfromfile(string fn, vector<string>& file){
    int x = 0;
    ifstream text(fn.c_str());
    while(text.good()){
        getline(text, file.at(x));
        x++;
    }
    //cout << fn << endl;
}    

渡しているfnの値は、テキストファイルの名前( '10a.txt')です。渡しているファイルの値は、次のように宣言されています。

vector<string> file1;

サイズを定義しなかった理由は、ベクターを使用する必要があるとは思わなかったためです。ベクターは動的です...そうではありませんか?

この関数は、特定のテキストファイルを読み取り、各行の完全な内容を単一のベクトルセルに格納することになっています。

例最初の行の内容をfile.at(0)に格納します。2番目の行の内容をfile.at(1)に格納します。以下同様に、テキストファイルに行がなくなるまで続けます。

エラー:

'std :: out_of_range' what():vector :: _ M_range_checkのインスタンスをスローした後、terminateが呼び出されました

Whileループのチェックでこのエラーを防ぐことができると思いました!

よろしくお願いします。

9
Mark S.

ベクトルfileは空で、file.at(x)は範囲外の例外をスローします。 std :: vector :: Push_back が必要です:

std::string line;
while(std::getline(text, line))
{
    file.Push_back(line);
}

または、単にファイルから文字列のベクトルを作成することもできます:

std::vector<std::string> lines((std::istream_iterator<std::string>(fn.c_str())),
                                std::istream_iterator<std::string>());
3
billz

file.at(x)は、x番目の位置にある要素にアクセスしますが、これは存在する必要があります。存在しない場合は、自動的に作成されません。ベクトルに要素を追加するには、Push_backまたはinsertを使用する必要があります。例えば:

file.Push_back(std::string()); // add a new blank string
getline(text, file.back());    // get line and store it in the last element of the vector
0
ChronoTrigger