fseek()和ftell()的工作原理

fseek()的第1个参数是FILE指针, 指向待查找的文件, fopen()应该已打开该文件。
fseek()的第2个参数是偏移量(offset) 。 该参数表示从起始点开始要移动的距离(参见表13.3列出的起始点模式) 。 该参数必须是一个long类型的值, 可以为正(前移) 、 负(后移) 或0(保持不动) 。
fseek()的第3个参数是模式, 该参数确定起始点。 根据ANSI标准, 在stdio.h头文件中规定了几个表示模式的明示常量(manifest constant) , 如表13.3所示。
fseek()和ftell()的工作原理_第1张图片

下面是调用fseek()函数的一些示例, fp是一个文件指针:
fseek(fp, 0L, SEEK_SET); // 定位至文件开始处
fseek(fp, 10L, SEEK_SET); // 定位至文件中的第10个字节
fseek(fp, 2L, SEEK_CUR); // 从文件当前位置前移2个字节
fseek(fp, 0L, SEEK_END); // 定位至文件结尾
fseek(fp, -10L, SEEK_END); // 从文件结尾处回退10个字节
 

如果一切正常, fseek()的返回值为0; 如果出现错误(如试图移动的距
离超出文件的范围) , 其返回值为-1。
 

ftell()函数的返回类型是long, 它返回的是当前的位置。 ANSI C把它定
义在stdio.h中。 在最初实现的UNIX中, ftell()通过返回距文件开始处的字节
数来确定文件的位置。 文件的第1个字节到文件开始处的距离是0, 以此类
推。 ANSI C规定, 该定义适用于以二进制模式打开的文件, 以文件模式打
开文件的情况不同。 这也是程序清单13.4以二进制模式打开文件的原因。

/* reverse.c -- displays a file in reverse order */
#include 
#include 
#define CNTL_Z '\032'   /* eof marker in DOS text files */
#define SLEN 81
int main(void)
{
    char file[SLEN];
    char ch;
    FILE* fp;
    long count, last;

    puts("Enter the name of the file to be processed:");
    scanf("%80s", file);
    if ((fp = fopen(file, "rb")) == NULL)
    {                               /* read-only mode   */
        printf("reverse can't open %s\n", file);
        exit(EXIT_FAILURE);
    }
    //把当前位置设置为距文件末尾 0 字节偏移量。 也就是说, 该语句把当前位置设置在文件结尾
    fseek(fp, 0L, SEEK_END);        /* go to end of file */

    //把从文件开始处到文件结尾的字节数赋给last
    last = ftell(fp);

    //倒叙输出
    for (count = 1L; count <= last; count++)
    {
        fseek(fp, -count, SEEK_END); /* go backward      */
        ch = getc(fp);
        if (ch != CNTL_Z && ch != '\r')  /* MS-DOS files */
            putchar(ch);
    }
    putchar('\n');
    fclose(fp);

    return 0;
}


 

你可能感兴趣的:(C/C++,fseek)