文件位置指针操作fewind和ftell

本文介绍了如何使用C语言中的rewind()和ftell()函数来控制文件读写的位置。通过实例展示了如何将文件指针重置到文件开头以及如何获取当前文件指针的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fewind()

函数名: rewind()
功 能: 将文件内部的位置 指针 重新指向一个流( 数据流 /文件)的开头
注意:不是 文件指针 而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。
rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET); [1]  
用 法: void rewind(FILE *stream);
头文件: stdio.h
返回值:无
举例
//以数据块的形式对文件的操作
int file_option_block()
{
    FILE *fp;
    char  strTextGets1[20] = {"aaaaadasdsd"};
    char  strTextGets2[20] = {"12345678912"};
    char  strTextBuff[50] = {0};
    int iwr_cnt = 0;
    if(NULL == (fp = fopen("X:\\FileTest\\filetext","w+")))
    {
        printf("创建文件失败!\n");
    }
    else
    {
        printf("创建文件成功!\n");
    }
    fputs(strTextGets1,fp);
    iwr_cnt = fwrite(strTextGets2,sizeof(strTextGets2),1,fp);
    printf("写入成功的数据块个数为:%d\n",iwr_cnt);

   //将文件的位置指针设置到文件的开头
    rewind(fp);
    while(0 == feof(fp))
    {
        fread(strTextBuff,20,1,fp);
        printf("读取到的数据块内容是:%s\n",strTextBuff);
    }
    fclose(fp);
}


ftell()
函数名
ftell

ftell函数原型

long ftell (FILE *stream);

ftell函数功能

使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置。

ftell约束条件

因为ftell返回long型,根据long型的取值范围-2 31 ~2 31 -1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错。

ftell(fp);
利用函数 ftell() 也能方便地知道一个文件的长。如以下语句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp); 首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。

举例1:
?
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int  main( void )
{
    FILE  *stream;
    stream =  fopen ( "MYFILE.TXT" "w+" );
    fprintf (stream,  "This is a test" );
    printf ("The file pointer is at byte \
    %ld\n",  ftell (stream));
    fclose (stream);
    return  0;
}
举例2:
ftell一般用于读取文件的长度,下面补充一个例子,读取文本文件中的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
int  main()
{
    FILE  *fp;
    int  flen;
    char  *p;
    /* 以只读方式打开文件 */
    if ((fp =  fopen  ( "1.txt" , "r" ))==NULL)
    {
         printf ( "\nfile open error\n" );
         exit (0);
    }
    fseek (fp,0L,SEEK_END);  /* 定位到文件末尾 */
    flen= ftell (fp);  /* 得到文件大小 */
    p=( char  *) malloc (flen+1);  /* 根据文件大小动态分配内存空间 */
    if (p==NULL)
    {
        fclose (fp);
        return  0;
    }
    fseek (fp,0L,SEEK_SET);  /* 定位到文件开头 */
    fread (p,flen,1,fp);  /* 一次性读取全部文件内容 */
    p[flen]= '\0' /* 字符串结束标志 */
    printf ( "%s" ,p);
    fclose (fp);
    free (p);
    return  0;
}
程序改进
1
2
3
4
5
7
8
9
10
11
#include <stdio.h>
main()
{
    FILE  *myf;
    long  f1; //此处将f1设置为long 可以读取更长的文件
    myf= fopen ( "1.txt" , "rb" );
    fseek (myf,0,SEEK_END);
    f1= ftell (myf);
    fclose (myf);
    printf (“%d\n”,f1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值