C语言lseek()函数和 fseek()函数 rewind函数

本文介绍了C语言中用于移动文件读写位置的三个函数:lseek()、fseek()和rewind()。lseek()允许开发者直接通过文件描述符控制文件的读写位置;fseek()则是针对文件流,通过文件指针进行位置调整;rewind()函数将文件位置指针重置到文件开头。文章详细阐述了每个函数的用法和参数含义,并给出了示例用法。

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

lseek():移动文件读写位置

头文件:

#include <sys/types.h>  
#include <unistd.h>

定义函数:

off_t lseek(int fildes, off_t offset, int whence);

函数说明:

每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes 为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数.

参数 whence 为下列其中一种:

    SEEK_SET 参数offset 即为新的读写位置.
    SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
    SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
    SEEK_END 时, 参数offet 允许负值的出现.

下列是教特别的使用方式:

  1. 欲将读写位置移到文件开头时:lseek(int fildes, 0, SEEK_SET);
  2. 欲将读写位置移到文件尾时:lseek(int fildes, 0, SEEK_END);
  3. 想要取得目前文件位置时:lseek(int fildes, 0, SEEK_CUR);

返回值:当调用成功时则返回目前的读写位置, 也就是距离文件开头多少个字节. 若有错误则返回-1, errno 会存放错误代码.

附加说明:Linux 系统不允许lseek()对tty 装置作用, 此项动作会令lseek()返回ESPIPE.

fseek()函数: 移动文件流的读写位置

头文件:

#include <stdio.h>

定义函数:

int fseek(FILE * stream, long offset, int whence);

函数说明:
fseek()用来移动文件流的读写位置.

1、参数stream 为已打开的文件指针,
2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
SEEK_END 时, 参数offset 允许负值的出现.

下列是较特别的使用方式:

  1. 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
  2. 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, 0SEEK_END);

返回值:当调用成功时则返回0, 若有错误则返回-1, errno 会存放错误代码.

附加说明:fseek()不像lseek()会返回读写位置, 因此必须使用ftell()来取得目前读写的位置.

#include <stdio.h>
main()
{
  FILE * stream;
  long offset;
  fpos_t pos;
  stream = fopen("/etc/passwd", "r");
  fseek(stream, 5, SEEK_SET);
  printf("offset = %d\n", ftell(stream));
  rewind(stream);
  fgetpos(stream, &pos);
  printf("offset = %d\n", pos);
  pos = 10;
  fsetpos(stream, &pos);
  printf("offset = %d\n", ftell(stream));
  fclose(stream);
}

执行:

offset = 5
offset = 0
offset = 10

rewind函数

文件指针FILE *fp中,包含一个读写位置指针char * _nextc, 它指向下一次文件读写的位置。

  typedef struct
   {
    int _fd;    /* 文件号 */
    int _cleft;   /* 缓冲区中剩下的字节数 */
    int _mode;   /* 文件操作模式 */
    char * _nextc; /* 下一个字节的位置 */
    char * _buff; /*文件缓冲区位置 */
   }FILE; 

每当进行一次读写后,该指针自动指向下一次读写的位置。
当文件刚打开或创建时,该指针指向文件的开始位置。
可以用函数 ftell()获取当前的位置指针,也可以用rewind()/ fseek()函数改变位置指针,使其指向需要读写的位置。

rewind()函数
原型:void rewind(FILE *fp)
作用:使文件fp的位置指针指向文件开始。

[例12.4] 把一个文件的内容显示在屏幕上,并同时复制到另一个文件。

#include "stdio.h"

void main()
{
FILE *fp1, *fp2;
fp1 = fopen("file1.c", "r"); /* 源文件 */

fp2 = fopen("file2.c", "w"); /* 复制到file2.c */

while(!feof(fp1)) putchar(fgetc(fp1)); /* 显示到屏幕上 */

rewind(fp1); /* fp回到开始位置 */

while(!feof(fp1)) fputc(fgetc(fp1), fp2);

fclose(fp1);

fclose(fp2);
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值