首页 > 编程笔记 > C语言笔记 阅读:15

C语言fseek()、rewind()和ftell()函数的用法(附带实例

在对文件进行操作时往往不需要从头开始,只需对其中指定的内容进行操作,这时就需要使用文件定位函数来实现对文件的随机读写。

本节将介绍 3 种随机读写函数。

C语言fseek()函数

fseek() 函数的一般形式如下:
fseek(文件指针,位移量,起始点);
有以下几点说明:
表 1 起始点
起始点 符号表示 数字表示
文件首 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件尾 SEEK_END 2

例如:
fseek(fp,-20L,1);
上述代码表示将位置指针从当前位置向后退 20 个字节。

注意,fseek() 函数一般用于二进制文件。在文本文件中由于要进行转换,往往计算的位置会出现错误。

【实例】某公司的一项福利是给员工过生日。本实例要实现输入出生年月日,如“19900202”,输出该员工的生日日期。具体代码如下:
#define _CRT_SECURE_NO_WARNINGS                 /*解除vs安全性检测问题*/
#include<stdio.h>
#include<process.h>
int main()
{
    FILE* fp;                   /*定义一个指向FILE类型结构体的指针变量*/
    char filename[30], str[50];  /*定义两个字符型数组*/
    printf("please input filename:\n");
    scanf("%s", filename);                    /*输入文件名*/
    if ((fp = fopen(filename, "wb")) == NULL) /*判断文件是否打开失败*/
    {
        printf("can not open!\n Press any key to continue\n");
        getchar();
        exit(0);
    }
    printf("please input string:\n");
    getchar();
    gets(str);
    fputs(str, fp);                     /*将字符串写入fp所指向的文件中*/
    fclose(fp);
    if ((fp = fopen(filename, "rb")) == NULL)    /*判断文件是否打开失败*/
    {
        printf("can not open!\n Press any key to continue\n");
        getchar();
        exit(0);
    }
    fseek(fp, 4L, 0);                     /*移动的字节数*/
    fgets(str, sizeof(str), fp);
    putchar('\n');
    puts(str);
    fclose(fp);                           /*关闭文件*/
    return 0;
}
程序运行结果为:
please input filename:
D:\demo.txt
please input string:
19930504
0504
上面的程序中有这样一句代码:
fseek(fp,4L,0);
此代码的含义是将位置指针指向距文件首 4 个字节的位置,也就是指向字符串中的第 5 个字符。

C语言rewind()函数

rewind() 函数也能起到定位文件指针的作用,从而达到随机读写文件的目的。

rewind() 函数的一般形式如下:
int rewind(文件指针)
该函数的作用是使位置指针重新返回文件的开头,该函数没有返回值。

【实例】编写程序将文件内容“我很帅”输出两遍。具体代码如下:
#define _CRT_SECURE_NO_WARNINGS              /*解除vs安全性检测问题*/
#include<stdio.h>
#include<process.h>
int main()
{
    FILE* fp;                    /*定义一个指向FILE类型结构体的指针变量*/
    char ch, filename[50];
    printf("please input filename:\n");
    scanf("%s", filename);                        /*输入文件名*/
    if ((fp = fopen(filename, "r")) == NULL)     /*以只读方式打开该文件*/
    {
        printf("cannot open this file.\n");
        exit(0);
    }
    ch = fgetc(fp);
    while (ch != EOF)
    {
        putchar(ch);                         /*输出字符*/
        ch = fgetc(fp);                      /*获取fp指向文件中的字符*/
    }
    rewind(fp);                              /*指针指向文件开头*/
    printf("\n");
    ch = fgetc(fp);                          /*读出一个字符*/
    while (ch != EOF)
    {
        putchar(ch);                          /*输出字符*/
        ch = fgetc(fp);                       /*读出一个字符*/
    }
    printf("\n");
    fclose(fp);                               /*关闭文件*/
    return 0;
}
程序运行结果为:

please input filename:
D:\Demo.txt
我很帅
我很帅

从该实例代码和运行结果可以看出以下内容:
1) 程序中通过以下 6 行语句输出了第一个“我很帅”:
ch = fgetc(fp);
while (ch != EOF)
{
    putchar(ch);
    ch = fgetc(fp);
}

2) 在输出了第一个“我很帅”后文件指针已经移动到了该文件的尾部,使用 rewind() 函数再次将文件指针移到文件的开始部分,因此当再次执行上面的 6 行语句时就会输出第二个“我很帅”。

C语言ftell()函数

ftell() 函数的一般形式如下:
long ftell(文件指针)
该函数的作用是得到流式文件中的当前位置,用相对于文件开头的位移量来表示。当 ftell() 函数的返回值为 -1L 时,表示出错。

【实例】银行规定密码只能是 6 位。请编写程序实现密码设置为 6 位,表示设置密码成功,否则表示失败。具体代码如下:
#define _CRT_SECURE_NO_WARNINGS                /*解除vs安全性检测问题*/
#include<stdio.h>
#include<process.h>
int main()
{
    FILE* fp;                    /*定义一个指向FILE类型结构体的指针变量*/
    int n;
    char ch, filename[50];
    printf("please input filename:\n");
    scanf("%s", filename);                       /*输入文件名*/
    if ((fp = fopen(filename, "r")) == NULL)     /*判断是否能打开文件*/
    {
        printf("cannot open this file.\n");
        exit(0);
    }
    ch = fgetc(fp);                             /*读出一个字符*/
    while (ch != EOF)
    {
        putchar(ch);
        ch = fgetc(fp);
    }
    n = ftell(fp);                              /*输出长度*/
    if (6 == n)                                 /*判断长度是否等于6*/
        printf("\n设置密码成功\n");
    else
        printf("\n设置密码失败\n");
    fclose(fp);                                 /*关闭文件*/
    return 0;
}
程序运行结果为:

please input filename:
D:\demo.txt
124579
设置密码成功

总结

本节主要讲解了 fseek()、rewind() 及 ftell() 函数,在编写程序的过程中经常会用到文件定位函数。

例如下面将要介绍的实例,要实现将一个文件中的内容复制到另一个文件中时就可以使用 fseek() 函数直接将文件指针指向文件尾,这样就可以将另一个文件中的内容逐个写到该文件中所有内容的后面,从而实现复制操作。

【实例】两个文件的内容分别为“一日之计在于晨”和“,一年之计在于春”,利用文件复制操作将两个文件的内容在一个文件中输出。
#define _CRT_SECURE_NO_WARNINGS               /*解除vs安全性检测问题*/
#include<stdio.h>
#include<process.h>
void main()
{
    FILE* fp1, * fp2;            /*定义指向FILE类型结构体的指针变量*/
    char ch, filename1[30], filename2[30];    /*定义字符数组变量*/
    printf("请输入文件1的名字:\n");
    scanf("%s", filename1);                  /*输入文件1的名字*/
    printf("请输入文件2的名字:\n");
    scanf("%s", filename2);                  /*输入文件2的名字*/
    if ((fp1 = fopen(filename1, "ab+")) == NULL)/*判断文件1能否打开*/
    {
        printf("can not open,Press any key to continue\n");
        getchar();
        exit(0);
    }
    if ((fp2 = fopen(filename2, "rb")) == NULL) /*判断文件2能否打开*/
    {
        printf("can not open,Press any key to continue\n");
        getchar();
        exit(0);
    }
    fseek(fp1, 0L, 2);
    while ((ch = fgetc(fp2)) != EOF)
    {
        fputc(ch, fp1);
    }
    fclose(fp1);                            /*关闭文件*/
    fclose(fp2);
}
程序运行结果为:

请输入文件 1 的名字:
D:\demo1.txt
请输入文件 2 的名字:
D:\demo2.txt

复制前两个文件中的内容分别为:

demo1.txt:
一日之计在于晨
demo2.txt:
,一年之计在于春

执行复制操作后文件 1 中的内容为:

一日之计在于晨,一年之计在于春

当然,对于文件的复制操作,还有很多其他方法可以实现,但是这里使用 fseek() 函数会使代码更简洁。

相关文章