2017-02-19 21 views
-3

私はVS2015 C++を使用しています。私はファイルを読み込み、whileループを使ってベクトルに行単位で入力しようとしました。デバッグアサーション失敗したベクトルの添え字が範囲外C++

Debug Assertion Failed!

Program: C:\Windows\SYSTEM32\MSVCP140D.dll

File: c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector

Line: 1234

Expression: vector subscript out of range

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

私のコードは次のとおりです。:

53.74 
54.09 
53.5 
53.72 
53.43 

int main() { 
std::ifstream inf("walmart2.txt"); 

std::vector<std::string> blah; 
int j = 0; 

if (!inf) { 
    std::cerr<< "Uh oh, walmart2.txt could not be opened for reading!" << std::endl; 
    exit(1); 
} 
while (inf) 
{ 
    std::string strInput; 
    inf >> strInput; 
    blah[j] = strInput; 
    j = j + 1; 
} 

std::cout << blah.size() << '\n'; 

return 0; 
} 

ファイル "walmart2.txt" は、次の形式で約1800行です

は、私はこのエラーを取得します

私は何が起こっているかについて完全にはわかっていません。どんな助けもありがとうございます。

+0

'何とか[J] = strInput;' => '何とか.push_back(strInput); ' –

+1

あなたの' blah'のように)デフォルトで構築されたベクトルは*空です*。つまり、それらの中のインデックス付け(インデックス '0'でも)は範囲外になります。 –

答えて

0
blah[j] = strInput; 

blahが空であるため、これは未定義の動作です。これは、コンパイラがプログラムに何かをさせることができることを意味します。

正しい設定でコンパイルすると、Visual C++は実際にバグを検出してこのエラーメッセージを表示するために、C++標準で未定義の動作を利用します。

ではなく push_backを使用してバグを修正:

blah.push_back(strInput); 
+0

ありがとう...ちょっとフォローアップ... 'strInput'を文字列からdoubleに変換することは可能ですか?または単に文字列の代わりにdoubleとして行を読む方法があります – Migos

+0

@Migos: 'std :: stod'。 –

+0

これは別の質問です。 StackOverflowで重複が多いと思われます。 – drescherjm

0

インデックスblah[j] = strInput;を使用してベクトルにアクセスしていますが、ベクトルのサイズはゼロです。

あなたは

blah.push_back(strInput); 

を使用してあなたの目標をacheiveすることができますし、サイズはint彼は開始を知っていれば、あなたはこのような何かを行うことができます。

std::vector<std::string> blah(n); // Vector of size n will be declared 
blah[j] = strInput; // 0 <= j < n 
0

使用push_back代わりにオペレータの[]あなたのベクトルに値を入れて:vec.push_back(input);

関連する問題