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

  • 질문

  • 는 모죠? ㅋㅋ

    // state not okay, return EOF

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

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

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

    감사합니다 __)

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

답변

  • 원인을 찾았습니다.  

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

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

    2012년 7월 12일 목요일 오전 1:00

모든 응답

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

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

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

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

     

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

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

    2012년 7월 11일 수요일 오전 2:17
    중재자
  • 네 추려서 올려보겠습니다. 아 그리고 궁금한 점이 있는데 eatwhite() 매소드도 \t, \n, space 상관없이 공백을 다 처리하나요?

    ws는 그렇더라구요

    2012년 7월 11일 수요일 오전 2:28
  • tab 과 space 만 제거 하지 않나요? \n 은 포함되지 않을텐데요?
    2012년 7월 11일 수요일 오전 4:00
    중재자
  • 원인을 찾았습니다.  

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

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

    2012년 7월 12일 목요일 오전 1:00