2017-02-28 2 views
0

다음 C 프로그램은 이전 버전과 텍스트 파일을 인쇄합니다텍스트 파일을 거꾸로 인쇄하는 프로그램에서 오프셋 대신 -2의 오프셋을 사용하여 fseek를 호출해야하는 이유는 무엇입니까?

#include <stdio.h> 
#define SEEK_SET 0 
#define SEEK_CUR 1 
#define SEEK_END 2 
int main(int argc, char **argv) 
{ 
    FILE *fp = f 
    open(argv[1], "r"); 
    fseek(fp, -1L, SEEK_END); 
    while (ftell(fp)) 
    { 
     putchar(fgetc(fp)); 
     fseek(fp, -2L, SEEK_CUR); 
    } 

putchar(fgetc(fp)); 

프로그램이 이전 버전과 텍스트 파일을 인쇄하도록되어 있기 때문에,이 모든 문자를 건너 뛰는없이 끝에서 각각의 모든 문자를 읽을 예정이다. 그렇다면 while 루프 내에서 호출이 있어야한다고 생각했습니다.

fseek(fp, -1L, SEEK_CUR); 

어떻게 오프셋이 -2가 아닌 -1이됩니까?

미리 감사드립니다.

+3

fgetc()가 1만큼 앞으로 이동했기 때문에 이전에 char로 돌아 가기 위해 2로 되돌려 야합니다. –

+0

seek-1은 매번 동일한 문자를 표시하기 때문입니다. –

+0

이것은 휴대용이 보장되지 않습니다 - 텍스트 파일을 임의로 "찾을"수는 없습니다 –

답변

1

fgetc를 호출하면 오프셋은 예상 한 것보다 1 문자 앞으로 나오므로 원하는 문자를 얻으려면 2를 뒤로 이동해야합니다. 그렇지 않으면 항상 같은 숯을 얻게 될 것입니다.

+0

고맙습니다. fgetc는 문자를 반환 한 후에 만 ​​1 문자 앞으로갑니다. @Luis Cabrero – Tree

+1

fgetc가 성공하지 못하면 EOF (파일 끝)를 반환하고 errno를 설정하여 오류를 나타냅니다. 그래서, 그렇습니다. char가 반환 될 경우에만 1 숯 앞에옵니다. 당신이 거꾸로 간다면 이것은 일어나지 않을 것입니다. –

+1

고마워. 실제로, 나는 아직도 확실하지 않다 : 내 텍스트 파일에 문자열 "abcd"가 포함되어 있다고 가정하면 fgetc은 'd'를 반환 한 다음 지시자를 오른쪽으로 1만큼 앞으로 이동시키고 거기에는 아무것도 없다. fssek를 호출하여 2 단계 뒤로 이동하므로 문자는 'c'가됩니다. 그러면 fgetc가 지시자를 'd'로 올리면 -2의 오프셋을 가진 feek에 대한 호출이 만들어 지므로 문자 'b'가 출력됩니다. 그래서 .... 맞나요? @ 루이스 카브레로 – Tree

관련 문제