0

辞書ファイルから単語を読み込もうとしていますが、ファイルからの読み込みで4行目にセグメンテーション違反が発生しています。挿入コマンドを使用するためにC++のベクトルについて読んだことから、プレースホルダーとして使用するイテレーターを指定する必要があります。これを行うには、ベクトルの先頭でイテレータをインスタンス化します。

 vector<string>::iterator it = dictionaryFile.begin();

forループの内部で、インクリメント演算子を使用してイテレータが指している場所をインクリメントします

it++;

私はこれをwww.cplusplus.comの例に基づいています。イテレータは最初の3行で機能し、その後セグメンテーション違反が発生します。getlineによって読み込まれている誤った文字がないことを確認するために、ファイルを再確認しました。このエラーは、ベクトルのオーバーフローがないことを確認するために行う予約の呼び出しに関係していると思います。

宣言されたときにキーワードnewを使用していないので、ベクトルは5の容量に制限されていますか?しかし、使用されている新しいキーワードの例は見つかりません!

このエラーの原因となるコードのセグメントを含めました。このセグメンテーション違反を解決するためにこれを数回再設計したことに注意してください。これは私の元の実装ではありませんでした。C++のマスターが持っているかもしれない洞察をいただければ幸いです。お時間をいただきありがとうございます。

vector<string> dictionaryFile (5, "");                                                                     //Declaration of vector that will hold the words in the dictionary

ifstream input;                                                                                                  //Declaration of input file stream
input.open(inst.c_str());

/********************** Test to see if file was opened ********************************/                
if(!input){
    cerr << "The file " << inst <<" does not exists in this directory" << '\n';
}
/********************** File is successfully opened**********************************/

string temporaryProcessingString = "";                                                                //This string will temporarily hold values read in from the file
vector<string>::iterator it = dictionaryFile.begin();                                                 //Creates iterator to step through the vector and fix this wild shit

for(int i = 0; getline(input, temporaryProcessingString); i++){                                 //See I can follow directions given in class no eof used.
    cout << "Does this print before SegFault 1 " << endl;
    if(dictionaryFile.size() >= (dictionaryFile.capacity() - dictionaryFile.size()) ){       //If current size is greater the 50% capacity reserve size*2 more memory
        int oldSize;
        oldSize = dictionaryFile.size();
        cout << "Does this print before SegFault 2 " << endl;
        dictionaryFile.reserve(oldSize + oldSize);                                                  //Reservation new capacity for vector containing dictionary
    }

/** this is a test bracket that solely keeps track of the vectors size and capacity in the terminal COMMENT OUT BEFORE SUBMITTING*/
cout << "________________________________________________" << '\n';
cout << "Loop Run: " << i << endl;
cout << "Size: " << dictionaryFile.size() << ", Capacity: " << dictionaryFile.capacity() << endl;
cout << "________________________________________________" << '\n';
dictionaryFile.insert(it, temporaryProcessingString); /*******************************THIS LINE CAUSES THE SEGFAULT! UNFORTUNATELY IT IS ALSO THE LINE THAT MOVES THE DATA INTO THE VECTOR************************/
it++;
cout << "Dictionary Entry: " << dictionaryFile[i] << endl;

}
cout << "Dictionary Entry Primary Test: " << dictionaryFile[0] << endl;
4

1 に答える 1

7

ベクトルのサイズが現在の容量に近づくと(または、呼び出した場合は、ここvector::reserveでイテレータの有効性に関するセクションを参照してください)、内部アルゴリズムがそれを再割り当てし、潜在的に別の場所に移動して、すべてのイテレータをベクトルが無効です。

あなたのプログラムはとにかく最後に挿入するだけのように見えるので、これを防ぐためvector::push_backに代わりにを使用してください。vector::insert次に、ingをスキップすることもできますreserve-内部アルゴリズムは非常に優れています(ベクトルがすべての新しい要素に対して再割り当てを行うことを恐れる必要はありません-アルゴリズムはそれよりも賢いです)。

于 2013-02-13T01:54:54.590 に答える