2017-04-26 1 views
-1

여러 개의 파일 이름, 공백 actions라는 문자열을 가지고 있고, 라인은 다음과 같이 그 파일 이름 사이 나누기 :Ifstream 세그먼트 오류

File1 File2 File3 File4 
File5 File6 File7 File8 

내가 하나 하나 파일을 열려면, 그래서 내가 문자열을 공백으로 분리하여 파일 이름을 개별적으로 가져옵니다.

std::stringstream ss(actions); 
std::string newline; 

while(std::getline(ss, newline, '\n')){ 
    std::stringstream s1(newline); 
    std::string espacos; 
    std::getline(s1,espacos,' '); 
    char* file = &espacos[0u]; 
    cout << file << '\n'; 
    ifstream ficheiro; 
    ficheiro.open(file); 
    .... 
} 

여기가 내가 갈라진다.

문자열 espacos은 파일 이름을 하나씩 가져 와서 줄 바꿈을 반복합니다.

나는 에서 char*으로 변환되지만 결국에는 세그먼트 오류가 발생합니다.

나는 디버거를 사용하고이 선이 분할 고장의 원인이되었다고 말했다 : 그래서

ficheiro.open(file); 

내가 모든 확인 있는지 확인하기 위해 char* file 인쇄를, 나는이 출력 얻을 :

File1 
File2 
File3 
File4 

모든 것이 파일 이름에 맞고, 모든 파일을 열 수 있지만 File4이지만이 오류의 원인은 무엇이라고 생각하십니까?

추 신 : 매 루프마다 파일을 닫습니다.

+7

하십시오 ** [편집] ** A [mcve] 또는 [SSCCE (짧은, 콘도, 올바른 예)] (HTTP와 질문 : // sscce.org) – NathanOliver

+0

해당 코드는 각 줄의 첫 번째 이름 만 가져옵니다. 중요한 결석이 있어야합니다. – molbdnilo

+0

나는 모든 이름을 얻는 루프를 잊었다. –

답변

1

file이 유효한 null 종료 C 스타일 문자열을 가리키고 있지 않으면 segfault에 표시된 코드를 볼 수있는 유일한 방법입니다.

  • std::string 당신의 STL의 구현은 개별 문자를 개최 순차적 메모리 블록을 사용하지 않는 다음과 같은 경우에 발생할 수

    .

  • std::string의 STL 구현은 순차적 메모리 블록을 사용하지만 해당 메모리 블록을 널 종료하지 않습니다.

어느 쪽이든 유효한 null로 끝나는 C 스타일의 문자열이 아닌 포인터를 생산하는 &espacos[0u]을 일으킬 것입니다. 대부분의 STL 구현은 순차적 인 널 종료 메모리 블록 (구현을 단순화하므로)을 사용하지만 C++ 11이 그러한 구현을 시행 할 때까지는 보장되지 않습니다.

어쨌든 &espacos[0u]을 사용해서는 안됩니다.

말했다되고 그건
const char* file = espacos.c_str(); 

operator>> 기본적으로 공백과 줄 바꿈에 스트림을 분할 : 당신은 널 종료 C 스타일의 문자열에 대한 포인터를 반환하는 모든 C++ 버전에서 보장되는 대신 espacos.c_str()를 사용한다 당신은 크게 이것에 코드를 단순화 할 수 있도록 :

std::istringstream iss(actions); 
std::string espacos; 

while (iss >> espacos) { 
    cout << espacos << '\n'; 
    ifstream ficheiro(espacos.c_str()); 
    // or, in C++11 and later: 
    // ifstream ficheiro(espacos); 
    ... 
} 
+0

문제점이 무엇인지 알아 냈고 VBO에서 OpenGl을 사용하고 있습니다. 문제는 그 vbo와 관련이 있습니다.하지만 당신이 준 팁 때문에 감사 드리고 싶습니다. –