파일에서 블록을 읽을 때feof(fp)로 파일의 끝을 판단하는 것이 정말 안전합니까?

1710 단어 FilenullSystemFP
오늘 파일로 입력할 때 주의할 만한 문제가 발견되었다.
프로그램 보기:
 
 
#include <stdlib.h>
#include <stdio.h>
int main(void) 
{
    FILE*in=fopen("1.txt","r");
    int a,b;
    
    if(in==NULL)
    {
        printf("error:cannot open infile !
"); return -1; } while(!feof(in)){ fscanf(in,"%d %d",&a,&b); printf("%d %d
",a,b); } system("pause"); return 0; }

 
서류를 다시 보다.txt의 내용:
1  2
3  4
5  6
출력의 결과는 다음과 같다고 생각할 수도 있습니다.
1  2
3  4
5  6
너는 결과가 다음과 같다는 것을 발견할 수 있다.
1  2
3  4
5  6
5  6
어떻게 마지막 한 쌍의 데이터가 두 번 나타납니까?
프로그램이 파일에서 입력할 때 모두 네 번 입력했기 때문에 계획된 세 번보다 한 번 더 입력했다.너는 파일을 열어라.txt 검사 결과 데이터가 3줄밖에 없음
1  2
3  4
5  6
사실 56의 맨 뒤에 리턴이 하나 더 있는데 리턴은 보이지 않는다.
프로그램이 파일에서 56을 읽은 후에 파일에 리턴 문자가 하나 더 있기 때문에 이 때 파일은 아직 끝나지 않았습니다.!feof(in)의 값은 진짜입니다.그래서 이어서 파일에서 입력하고,
파일 포인터가 가리키는 파일 위치에 int 데이터가 두 개 없기 때문에 입력 실패 a와 b는 지난번에 입력한 값을 저장합니다.위에서 본 결과가 나올 겁니다.
사실 fscanf() 자체의 반환값을 이용하여 판단하면 문제가 없다.
프로그램은 다음과 같이 변경되었습니다.
#include <stdlib.h>
#include <stdio.h>
int main(void) 
{
    FILE*in=fopen("1.txt","r");
    int a,b;
    
    if(in==NULL)
    {
        printf("error:cannot open infile !
"); return -1; } while(fscanf(in,"%d %d",&a,&b)==2){ printf("%d %d
",a,b); } system("pause"); return 0; }

이때 출력 결과는 우리가 예상한 대로 되었다.
이때 내가 인접표를 쓸 때 저지른 잘못을 오랫동안 찾고서야 비로소 찾았다!

좋은 웹페이지 즐겨찾기