2012-05-08 3 views
0

다음 코드를 작성했지만 "abcd"를 입력하면 "dcb"가 표시되고 첫 번째 문자는 건너 뜁니다. while 루프의 논리가 파일 경계를 넘지 만 fseek (f2)는 여전히 파일 경계를 넘어갈 때 0이 아닙니다. 음의 값을 반환해야합니다.C에서 텍스트 파일을 반전

#include<stdio.h> 

int main() 
{ 
    FILE *f1,*f2; 
    char ch; 

    clrscr(); 

    f1=fopen("Input","w"); 

    while((ch=getchar())!=EOF) 
      putc(ch,f1); 


    fclose(f1); 

    f2=fopen("Input","r"); 

    fseek(f2,-1L,2); 

    while(ftell(f2)!=0) 
    { 
      ch=getc(f2); 
      printf("%c",ch); 
      fseek(f2,-2L,1); 
    } 

    fclose(f2); 

    getch(); 
    return(0); 
} 
+9

'fseek (f2, -1L, 2);'하지 마세요. 적절한 헤더 파일 (stdio.h)을 포함하고 상수 SEEK_SET, SEEK_CUR, SEEK_END를 사용하십시오. –

+2

가장 큰 실수는 마치 * 문자열 * 인 것처럼 * 파일 *을 뒤집어 쓰려고한다는 것입니다. – dasblinkenlight

+2

이것이 단순한 연습이 아니라면, wchar_t를 사용하면 다중 바이트 인코딩 (예 : utf-8) 및 no에 대해 실패하게됩니다. 유니 코드 결합 문자가 엉망이됩니다. –

답변

5

while-do 루프가 아니라 do-while 루프가 필요합니다.

ftell()이 0을 반환하지만 더 이상 읽지 않으면 문자를 읽어야합니다. 이는 대게 바닥 테스트를 거친 루프가 필요하고 최상위 테스트 루프가 필요 없다는 표시입니다.

+0

루프를 으로 변경했습니다. { ch = getc (f2); printf ("% c", ch); fseek (f2, -2L, 1); } while (ftell (f2)! = 0); 하지만 여전히 마지막 문자가 누락되었습니다 ...? – Ayush

+0

"다음"작업은 백 스페이스 위치입니다 (방금 읽었으므로 2 개 위치). 종료 조건은 백 스페이스를 사용할 수 없다는 것입니다. 따라서 fseek()를 조건으로 이동하고 백 스페이스로 테스트 할 수 있습니다. 그 조건은 "(ftell (f2)! = 0 && fseek (f2, -2L, SEEK_CUR) == 0)"이됩니다. 현재 ftell()을 사용하면 이미 BOF에있을 때 호출 할 수 있습니다. 오류가 발생하지 않을지 모를 때 함수를 호출하지 마십시오. –

0
#include <stdio.h> 

int main(){ 
    FILE *fp; 
    int ch; 

    fp=fopen("out.txt","w"); 

    while((ch=getchar())!=EOF) 
     fputc(ch,fp); 

    fclose(fp); 

    fp=fopen("out.txt","rb"); 

    fseek(fp,0L,SEEK_END); 

    while(fseek(fp,-2L,SEEK_CUR)==0){ 
     ch=fgetc(fp); 
     putchar(ch); 
    } 

    fclose(fp); 

    return(0); 
} 
+0

이것은 매우 깨끗한 해결책이지만 일부 C 라이브러리는 파일 시작 전에 검색하기 위해 오류를 반환하지 않습니다. fseek() 전에 ftell()을 추가하면 모든 라이브러리 동작에 대해 다뤄야합니다. –

+0

나는 깨끗하다고 ​​생각하지 않는다. 나는 fseek를 사용하여 스트림을 뒤집는 좋은 방법을 생각하지 않습니다. 그래서 필요한 경우 누구나 프로그램을 수정합니까? – BLUEPIXY

관련 문제