2014-02-26 3 views
1

이 코드에 문제가 있습니다. g ++로 컴파일 한 후 a.out을 실행하면 세그먼트 화 오류가 발생하고 "여기"가 표시되지 않습니다. 코드는 꽤 짧습니다.세그먼트 오류 main() 전에

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <sstream> 
using namespace std; 

bool inWords(vector<string> words, string str); 

int main() 
{ 
    cout << "here"; 

    vector<string> words; 
    string str; 
    istringstream iss; 
    ifstream file("data.txt", ifstream::in); 

    // read in words 
    for(int i = 0; file >> str; /*no i++*/) 
    { 
    if(str[str.length() - 1] == '.') 
     str.erase(str.length()-1); 
     // if word has a period at the end, erase it 

    if(!inWords(words, str)) 
    { 
     // if word is not in vector words, add it 
     words.push_back(str); 
     i++; 
    } 
    } 

    // output each word 
    for (vector<string>::size_type i = 0; i < words.size(); i++) 
    cout << words[i]; 

    // return to beginning of file 
    file.clear(); 
    file.seekg(0, ios::beg); 

    // read in sentences 
    // to be implemented 

    file.close(); 

    return 0; 
} 

bool inWords(vector<string> words, string str) 
{ 
    for(int i = 0; !words[i].empty(); i++) 
    if(words[i] == str) { return true; } 
    return false; 
} 

내가 아는 한 아무 문제가 없어야합니다. data.txt는 파일과 동일한 디렉토리에 있으며 명령 행에서 인수를받지 못합니다. 누구든지 도와 줄 수 있습니까?

+0

아무것도 표시되지 않는다고해서 프로그램이'main()'이전에 segfaults라는 것을 의미하지는 않습니다. 아마 출력 버퍼를 비우지 않고 프로그램을 종료했다는 것을 의미합니다. – Brian

+0

네 말이 맞아. 나는 "여기"다음에 추가하고 끝내므로 지금 나는 진짜 근원을 찾아야 만한다. 감사합니다 – Lucas

+0

을 sidenote로 사용 : 항상 I/O 작업이 성공했는지 여부를 확인하십시오. –

답변

1

메인보다 먼저 나오지 않습니다. 믿을 수 없을만큼 편리한 도구 인 디버거를 사용하여 어디서 일어나는 지 확인하십시오 (예 : GDB). "여기"가 보이지 않는 이유는 버퍼가 플러시되지 않기 때문입니다. 그 후에 출력을 강제로되도록 << std::endl을 입력하십시오.

기술적 인 측면 : main보다 먼저 segfault 할 수 있지만 생성자에서 발생합니다. 전역 범위에서 정의되거나 인스턴스화 된 사용자 지정 개체가없는 것을 봅니다.

+0

좋아, endl 것, 내 실수했다. 고맙습니다. – Lucas

+0

나는 정말로 디버거를 사용하는 법을 배웠다. 나는 당신의 프로그래밍 수명이 50 % 더 행복 할 것이라는 인터넷 보증을 제공합니다. 동의하는 것을 잊지 마세요.) – Cramer