2014-02-27 3 views
0

ifstream을 사용하여 파일에서 행을 가져 와서 문자열에 저장합니다. 각 행에는 공백없이 하나의 단어가 들어 있습니다.파일에서 행 읽기 - 여분의 공백 제거

virtual void readFromFile(char* input){ 
     ifstream inf(input); 

     if(!inf){ 
      cerr << "The specified file could not be found." << endl; 
     } 

     while(inf){ 
      string str; 
      getline(inf, str); 
      pushFront(str); // store it in my data structure 

     } 

     inf.close(); 
    } 

나는 첫 번째 파일에 해당하는 문자열을 length()를 호출 할 때, 올바른 값을 반환

a <= returns length 1 (correct) 
at <= returns length 3 
ate <= returns length 4 
rate <= returns length 5 
irate <= returns length 6 

file.txt를. 그러나 다른 모든 행에 해당하는 문자열에서 length을 호출하면 +1의 오프셋이 발생합니다. 예를 들어, 문자열의 길이가 실제로 5이면 6을 반환합니다. 이것은 새로운 줄과 관련이 있습니까? 그렇다면 어떻게 파일에서이 단어들을 제대로 추출 할 수 있습니까?

+0

줄에 간격이 기록되어 있지 않습니까? 잠재적으로 이것은 리눅스 시스템이 새로운 줄 '\ r'과 '\ n'에 사용하는 두 개의 기호와 관련 될 수 있지만, getline이 그것들을 다듬을 것이라고 생각합니다. 그렇더라도 잘못된 단어가 '\ r'또는 '\ n'로 끝나는 지 확인하고 확실하게 알 수 있습니다. –

+0

체크 아웃하겠습니다. – Bob

+0

나에게 잘 보이나요? http://oi61.tinypic.com/99qqsz.jpg – Bob

답변

1

vi를 텍스트 편집기로 사용하고 있으므로 :set list을 수행하여 보이지 않는 문자를 표시 할 수 있습니다. 이렇게하면 대부분의 줄에서 볼 수있는 추가 문자가 무엇인지 파악하는 데 도움이됩니다.

리눅스에서 일반적인 줄 끝은 "\ r \ n"이며 실제로 두 문자입니다. getline이 둘 다 생략할지 여부는 정확히 알 수 없습니다. 텍스트 파일의 형식이 정의되어있는 경우 모든 라인이 정확히 하나 개의 단어를 포함,

getline(inf, str); 
int len = str.size(); 
if (str[len - 1] == '\r') { 
    str.pop_back(); // not C++11 you do it str = str.erase(str.end() - 1); 
} 
pushFront(str); // store it in my data structure 
+1

[getline 함수에 대한 참조] (http://en.cppreference.com/w/cpp/string/basic_string/getline) 또는 [비슷한 토론] (http://stackoverflow.com/questions/)에 링크하는 것이 좋습니다. 6089231/get-std-ifstream-to-handle-lf-cr-and-crlf/6089413 # 6089413). – mbschenkel

0

, 그래서 더 쉽고,이 단어를 읽는 것이 더 확실하다 그러나, 단지 예방 조치로는 다음과 같은 논리를 추가 할 수 있습니다 .

void readFromFile(char* input){ 
    ifstream inf(input); 
    if(!inf){ 
     cerr << "The specified file could not be found." << endl; 
    } 
    for(string word; inf >> word;) 
     pushFront(word); // store it in my data structure 
} // inf.close() is done automaticly leaving the scope