파일에서 블록을 읽을 때feof(fp)로 파일의 끝을 판단하는 것이 정말 안전합니까?
프로그램 보기:
#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; }
이때 출력 결과는 우리가 예상한 대로 되었다.
이때 내가 인접표를 쓸 때 저지른 잘못을 오랫동안 찾고서야 비로소 찾았다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java에서 InputStream, String, File 간의 상호 전환 비교InputStream, String, File 상호 전환 1. String --> InputStream 2. InputStream --> String 오늘 인터넷에서 또 다른 방법을 보았는데, 특별히 가지고 와서 공...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.