ifstream 에서 peek() 메소드가 -1을 리턴하는 경우

답변됨 ifstream 에서 peek() 메소드가 -1을 리턴하는 경우

  • 2012년 7월 10일 화요일 오후 12:33
     
     

    는 모죠? ㅋㅋ

    // state not okay, return EOF

    이런 주석이 있는데 파일이 끝이아닌데 EOF 를 리턴하네요.. 그 뒤로 파일을 읽는데 이부분으로만 무한루프로 빠집니다. ㅠ

    지금 상황은 6.0을 2010으로 포팅하는 중이고 eatwhite()를 >>ws로 바꿔줬습니다.

    어떤 정보가 필요한지 몰라 답변 남겨주시면 더 상세한 부분 올리겠습니다.

    감사합니다 __)

모든 응답

  • 2012년 7월 10일 화요일 오후 2:34
    중재자
     
     

    파일의 끝이거나 읽을수 없는 상황일것 같습니다. 어떤 실수로 인하여 파일의 끝까지 이동된것은 아닌가요?

    끝이 아니라고 판단하신건 어떤 기준으로 확인하신건가요? 그 시점에서 tellg 한 값과 seekp 를 사용해서 파일의 끝으로 이동했을때의
    위치값이 다른지 확인해보셨나요?

  • 2012년 7월 11일 수요일 오전 1:52
     
     

    음..

    6.0 버전인경우는 그 뒤로 계속 읽어갑니다. 물론 open하는 파일도 동일하고 stream도 동일합니다.

    읽어들이는 부분이

    36   6   0  ""  -> 이 부분입니다.  순서대로 36, 6, 0, "" 을 읽어들이는데 다음엔 78이 읽히는게 정상이구 잘 작동됬습니다.
    78   2   0  ""

    읽어들이는 코드는 아래입니다.

    ""차례가 오면 m_File.peek() == '\"'이 참이 되고 아래 소스로 들어오게 됩니다.  

    1     ASSERT(m_File.peek() == '\"');
    2     char c, ch[LENGTH];
    3     CString Word;
    4     m_File>>c;    
    5     m_File.get(ch,LENGTH,'\"');
    6     Word=ch;
    7     if(!Word.IsEmpty() && Word.GetAt(Word.GetLength()-1) == '\"')
    8      Word.Delete(Word.GetLength()-1,1);
    9     ASSERT(m_File.peek() == '\"');
    10   m_File>>c;
    11   AddTail(Word);

    이럴 때 원래 9라인에서 참 값이 나와야 정상인데 -1이 반환됩니다.  6.0에서는 참 값이 나왔습니다..

    바뀐 부분이라곤 m_File.eatwhite()를 m_File>>ws로 바꾼부분이 다 입니다.

  • 2012년 7월 11일 수요일 오전 2:17
    중재자
     
     

    지금 나열하신 코드만 놓고 본다면 문제가 있을만한 부분이 없습니다. 아마도 다른곳에 문제가 있을듯하네요.
    그런데 위 코드에서는 화이트스페이스를 제거하는 코드가 없군요. 다른 곳에서 제거를 하시나보네요?
    가능하시다면 m_File >> ws 를 사용하는 부분쪽 코드를 나열해주시면 살펴보도록 하겠습니다.

     

    아 그리고 어짜피 MFC 를 하시는거고 정해진 양식을 읽어들여서 파싱하시는거면 그냥 CStdioFile
    클래스 사용하셔서 파일 오픈하시고 ReadString 으로 한줄씩 읽으면서 직접 문자열 파싱하는게
    코드가 더 간단하게 나올수 있습니다. 예외처리도 더 간편하구요.

    여러개의 입출력 장치가 호환성있게 사용되어야 하는 상황에서는 스트림을 사용하는게 훨씬
    좋지만 파일 입출력에 한정되고 형식이 정해져 있다면 굳이 스트림을 사용할 필요는 없습니다.
    시간되시면 한번 바꿔보시는것도 좋은 경험이 될듯합니다.

  • 2012년 7월 11일 수요일 오전 2:28
     
     

    네 추려서 올려보겠습니다. 아 그리고 궁금한 점이 있는데 eatwhite() 매소드도 \t, \n, space 상관없이 공백을 다 처리하나요?

    ws는 그렇더라구요

  • 2012년 7월 11일 수요일 오전 4:00
    중재자
     
     
    tab 과 space 만 제거 하지 않나요? \n 은 포함되지 않을텐데요?
  • 2012년 7월 12일 목요일 오전 1:00
     
     답변됨

    원인을 찾았습니다.  

    m_File.get(ch,LENGTH,'\"'); 함수가 이전과 다르게 ch에 아무것도 안들어오면 m_File stream state를 -1로 바꿔버리네요 그래서 peek이 호출되면 -1이 들어왔습니다.

    답변 감사합니다 많은 도움이 됬습니다 ^^