2010-11-28 2 views
2

do-while 루프를 사용하는 데 어려움을 겪고 있습니다. 파일 끝에 도달하면 을 멈추어야합니다. 여기에 루프 코드는 다음과 같습니다feof (FILE * f)를 사용하는 방법?

do { 
    if (pcompanyRow[0] != '#' && pass == 1) { 
     strtok(pcompanyRow, ":"); 
     pcompanyName = strcpy(pcompanyName, strtok(NULL, "")); 
     pass = 2; 
     fgets(pcompanyRow, 1024, f); 
    } 
    if (pcompanyRow[0] != '#' && pass == 2) { 
     strtok(pcompanyRow, ":"); 
     pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , "")); 
     pass = 3; 
     fgets(pcompanyRow, 1024 , f); 
    } 
    if (pcompanyRow[0] != '#' && pass == 3) { 
     strtok(pcompanyRow, ":"); 
     pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, "")); 
     pass = 4; 
     fgets(pcompanyRow, 1024, f); 
    } 
    if (pass == 4) { 
     AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice); 
     pass = 1; 
    } 
} while (!feof(f)); 

디버거를 실행 한 후, 나는 그것이 전체 라인에 도달하는 경우에도이 루프 밖으로 이동하지 않기 때문에 내가 가진 모든 충돌 문제가있는 것으로 나타났습니다.

어떻게 올바르게 작성해야합니까?

+1

답변에 따르면 간결한 대답은 "당신은 feof()를 사용하지 않습니다"입니다. 'feof()'를 사용하는 유일한 경우는 기본 입력 함수 (예 : fgets())에서 오류 또는 오류 표시가 나타나고 EOF와 오류를 구별하기로 결정한 경우입니다. 가장 자주, 대부분의 사람들은이 두 가지 (특히, 내가 본 코드 중 대부분)를 구별하지 않습니다. 나는'feof() '를 전혀 사용하지 않았다는 것을 기억합니다. 즉, 나는 C 프로그램의 지난 25 세기 동안 두 번이나 사용했을 것입니다. –

+0

@Jonathan : 오류가 발생했는지 알고 싶다면'feof (f) '보다는'ferror (f)'를 확인하는 것이 훨씬 더 합리적이라고 생각합니다. 때로는 'feof'가 do-while 루프에서 유용하지만 대부분의 경우에는 쓸모가 없다고 동의합니다. –

+0

@R .. : 네,'feof()'보다'ferror()'를 사용하는 것이 더 합리적입니다 만, 나는 자주 사용하지 않는다고 고백합니다. 하지만 제 의견에 그렇게 말 했어야했는데 - 아니면 공간이 부족한 이후로 두 번째 것을 추가해야했습니다. –

답변

4

나는이를 사용하도록 루프와 로직을 변경합니다 :

는 fgets()는 파일의 끝을지나 읽기를 시도
while (fgets(pcompanyRow, 1024, f) != NULL) { 

    /* do things */ 

} 

, NULL을 반환하고 당신은 루프의 탈옥 수 있습니다. pass과 다른 플래그/로직을 계속 사용할 수 있지만 확인하는 조건은 약간 다릅니다.

+0

루프가 완료되면 feof (f)를 사용하여 EOF인지 오류인지 확인할 수 있습니다. – EvilTeach

+0

오류가 있는지를 확인하기 위해'feof'보다는'ferror'를 사용합니다 ... –

+0

그게 내가 한 일입니다 아직도 멈추지 않을거야! 계속 나를 데리고 와라. –

8

루프의 종료 표시기로 feof()를 사용하지 마십시오. feof()는 EOF에 도달 할 때가 아니라 파일 끝 (EOF)이 읽힌 후에 TRUE가됩니다.

소스 here. 또한 문제를 자세히 설명하고 문제를 해결하는 방법을 설명합니다.

+0

나는 그 동안을 바꿨다 : while (fgets (pcompanyRow, 1024, f)! = NULL) –

+0

어쨌든 멈추지 않을 것이다! 내가 pcompanyRow 값을 볼 수 있습니다, 그것은 첫 번째 라인을 다시했다, 그것은 루프에 파일 라인을 가지고 와서 멈추지 않을거야 ... 내가 뭘 할 수 있을까? –

+1

+1하지만 문언에 의문을 제기합니다. EOF는 결코 '읽기'되지 않습니다. read 함수는 파일의 끝에 도달하여 EOF를 리턴 할 수 있지만 EOF는 읽은 값이 아닙니다. –

관련 문제