2017-02-19 4 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"은 다음과 같은 형식으로 약 1,800 라인입니다

나는이 오류

나는 무엇이 계속 진행되고 있는지 잘 모릅니다. 어떤 도움을 주셔서 감사합니다.

+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

고마워 ... 그냥 후속 ... 문자열에서 double로'strInput'을 변환 할 수 있습니까? 또는 그냥 문자열 대신 double로 읽는 방법입니다. – Migos

+0

@Migos :'std :: stod'. –

+0

다른 질문입니다. StackOverflow에서 많은 중복이 있다고 의심됩니다. – drescherjm

0

인덱스 blah[j] = strInput;을 (를) 사용하여 벡터에 액세스하고 있지만 벡터의 크기는 0입니다.

당신은

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);