2014-04-20 5 views
0

다음 C 프로그램이 있습니다.ftell() 및 fseek() 함수 사용에 문제가 있습니다

#include <stdio.h> 

int main() 
{ 
    FILE *fp; 
    long n; 
    char c; 

    fp=fopen("RANDOM","W"); 

    while((c=getchar()) != EOF) 
    { 
     putc(c,fp); 
    } 

    printf("No. of character entered = %1d\n",ftell(fp)); 
    fclose(fp); 

    n=0L; 

    while(feof(fp) == 0) 
    { 
     fseek(fp, n, 0); 
     printf("Position of %c is %1d\n", getc(fp), ftell(fp)); 
     n=n+5L; 
    } 
    printf("\n"); 

    fseek(fp,-1L,2); 
    do 
    { 
     putchar(getc(fp)); 
    } 
    while(!fseek(fp,-2L,1)); 

    fclose(fp); 

    return 0; 

} 

이 코드에는 오류가 표시되지 않습니다. 하지만 코드를 입력 할 때 ABCD ... Z이 표시되면 세그먼트 오류가 발생합니다. 코어가 덤프됩니다. 어디서 문제가 있습니까 ??

답변

0

처음에는 fclose(fp) 다음에 fp=fopen("RANDOM","R")을 추가하십시오.

파일을 닫은 후에 파일을 읽을 수 없으며 쓰기 전용으로 열 때 읽을 수 없습니다.

3

fclose() 다음에 feof()을 호출하는 것이 확실합니다. fp은 그 지점에서 닫히고 다른 IO 기능으로 기능 보강으로 전달되어서는 안됩니다.

대문자 "W"를 사용하지 마십시오 문제

1

)의 수 있지만, 소문자 "w". 다른 정의되지 않은 동작 (UB).

2) fopen("RANDOM","w")을 사용하면 파일이 길이가 0이고 쓰기가되지만, 업데이트는되지 않습니다. fopen("RANDOM","r+") "업데이트에 대한 열린 텍스트 파일 (읽기 및 쓰기)"또는 읽기와 쓰기에 대한 열고 fopen("RANDOM","w+")을 사용하는 것이 좋습니다 "제로 길이로 자르거나 업데이트에 대한 텍스트 파일 작성"char c; ... while((c=getchar()) != EOF)가 마지막으로 잘못 @BLUEPIXY

3) -of-file 조건은 일부 합법적 인 char에 플래그가 지정됩니다. 대신 int c을 사용하십시오.

4) printf("No. of... 이후 fclose(fp);에 대한 필요성 없음.

5) while(feof(fp) == 0) 무한 루프를 시작하십시오. 어떤 것이 든 if (feof(fp) == 0)을 사용하십시오. 학습자의 목적에 따라 테스트를 생략 할 수 있습니다.
5R) 괜찮을지도 모른다. fseek(fp, n, 0);

6) printf("Position of %c is %1d\n", getc(fp), ftell(fp));은 이 아니고 "%d"이 아니어야합니다.

7) fseek(fp, -1L, SEEK_SET); 또는 SEEK_CUR SEEK_END 같은 fseek(fp, n, 0);fseek(fp,-1L,2);하지만, 뭔가를 사용하지 마십시오.

8) fseek(fp,-1L,2);

9) fseek(fp,-1L,2);의 결과를 테스트 제안에 대한 코드의 목적이 무엇인지, 위 불분명 언급 한 바와 같이 표준 매크로를 사용하지 않고.

10) printf("Position of %c is %1d\n", getc(fp), ftell(fp));이 문제입니다. (@BLUEPIXY로 표시). getc(fp)ftell(fp)이 호출되면 컴파일러에서 선택하도록 남겨 둡니다. printf("Position of %c is ", getc(fp)); printf("%ld\n", ftell(fp));처럼 명시 적으로 표현하는 것이 좋습니다. 코드를 작성하기 전에 기존 파일을 절단하는 경우


"w"와 개방이 좋다.가운데를 제거하는 대신 fclose(), freopen(..., "r")을 고려하십시오.

+0

@BLUEPIXY 두 점 모두에 동의하십시오. printf()에 대한 args의 순서를 잘 잡아라. – chux

관련 문제