2017-02-19 27 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.

Мой код выглядит следующим образом:

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 строк в следующем формате:

53.74 
54.09 
53.5 
53.72 
53.43 

Я не совсем уверен, что происходит. Любая помощь приветствуется.

+0

'бла [J] = strInput;' => 'бла .push_back (strInput); ' –

+1

Построенные по умолчанию векторы (например, ваш' blah') * empty *. Это означает, что любое индексирование в них (даже индекс '0') будет за пределами границ. –

ответ

0
blah[j] = strInput; 

Это неопределенное поведение потому blah пуст. Это означает, что компилятор может заставить программу что-либо сделать.

При компиляции с правильными настройками Visual C++ использует это неопределенное поведение в стандарте C++, чтобы фактически обнаружить ошибку и показать вам это сообщение об ошибке.

исправить ошибку с помощью push_back вместо:

blah.push_back(strInput); 
+0

Спасибо ... просто следить ... возможно ли преобразовать 'strInput' из строки в double? или есть способ просто прочитать строку как двойную, а не строку – Migos

+0

@Migos: 'std :: stod'. –

+0

Это другой вопрос. Я подозреваю, что для StackOverflow существует много дубликатов. – drescherjm

0

Вы видите векторный указатель blah[j] = strInput;, но вектор имеет нулевой размер.

Вы можете получения идеальной своей цели с помощью

blah.push_back(strInput); 

И если вы знаете размер 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);

 Смежные вопросы

  • Нет связанных вопросов^_^