书接上回:文件操作(一)
fseek函数:
int fseek ( FILE * stream, long int offset, int origin );
FILE * stream
要读取的流(文件指针)
long int offset
二进制文件:要从源偏移的字节数。
文本文件:零或 ftell 返回的值。
int origin
文件偏移量位置
我们先打开一个文件,往里面放一些字符。
//VS编译器
#include <stdio.h>
#include <stdlib.h>
int main()
{
//打开文件
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("foppn fail!");
return (EXIT_FAILURE);
}
int ch = fgetc(pf);
printf("%c ", ch);//a
ch = fgetc(pf);
printf("%c ", ch);//b
ch = fgetc(pf);
printf("%c ", ch);//c
ch = fgetc(pf);
printf("%c ", ch);//d
ch = fgetc(pf);
printf("%c ", ch);//e
fclose(pf);
pf = NULL;
return 0;
}
运行代码结果:
然后我们使用fseek函数来改变读写文件的位置,看看效果。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//打开文件
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("foppn fail!");
return (EXIT_FAILURE);
}
int ch = fgetc(pf);
printf("%c ", ch);//a
ch = fgetc(pf);
printf("%c ", ch);//b
ch = fgetc(pf);
printf("%c ", ch);//c
ch = fgetc(pf);
printf("%c ", ch);//d
ch = fgetc(pf);
printf("%c \n", ch);//e
//当前文件读写光标位于e的后面
fseek(pf, -4, SEEK_CUR);//相对于当前位置向前面偏移4个字符
ch = fgetc(pf);
printf("相对于当前位置向前面偏移4个字符:%c \n", ch);//这里打印的应该是b
//当前文件光标位于b的后面
fseek(pf, 10, SEEK_SET);//相对于起始位置偏移10个字符
ch = fgetc(pf);
printf("相对于起始位置偏移10个字符:%c \n", ch);//这里应该打印的是k
fclose(pf);
pf = NULL;
return 0;
}
运行结果为:
当执行这部分代码时:
光标位置位于:
当执行这部分代码时:
光标位置位于:
ftell函数:
long int ftell ( FILE * stream );
函数功能:返回⽂件指针相对于起始位置的偏移量。
接上述代码我们加上ftell来看下偏移量:
//VS环境
#include <stdio.h>
#include <stdlib.h>
int main()
{
//打开文件
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("foppn fail!");
return (EXIT_FAILURE);
}
int count = 0;
int ch = fgetc(pf);
printf("%c ", ch);//a
ch = fgetc(pf);
printf("%c ", ch);//b
ch = fgetc(pf);
printf("%c ", ch);//c
ch = fgetc(pf);
printf("%c ", ch);//d
ch = fgetc(pf);
printf("%c \n", ch);//e
printf("当前位置相对于起始位置偏移量为:%d\n", ftell(pf));
//当前文件读写光标位于e的后面
fseek(pf, -4, SEEK_CUR);//相对于当前位置向前面偏移4个字符
ch = fgetc(pf);
printf("相对于当前位置向前面偏移4个字符:%c \n", ch);//这里打印的应该是b
printf("当前位置相对于起始位置偏移量为:%d\n", ftell(pf));
//当前文件光标位于b的后面
fseek(pf, 10, SEEK_SET);//相对于起始位置偏移10个字符
ch = fgetc(pf);
printf("相对于起始位置偏移10个字符:%c \n", ch);//这里应该打印的是k
printf("当前位置相对于起始位置偏移量为:%d\n", ftell(pf));
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
rewind函数:
函数功能:让⽂件指针的位置回到⽂件的起始位置。
接上述代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//打开文件
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("foppn fail!");
return (EXIT_FAILURE);
}
int count = 0;
int ch = fgetc(pf);
printf("%c ", ch);//a
ch = fgetc(pf);
printf("%c ", ch);//b
ch = fgetc(pf);
printf("%c ", ch);//c
ch = fgetc(pf);
printf("%c ", ch);//d
ch = fgetc(pf);
printf("%c \n", ch);//e
printf("当前位置相对于起始位置偏移量为:%d\n", ftell(pf));
//当前文件读写光标位于e的后面
fseek(pf, -4, SEEK_CUR);//相对于当前位置向前面偏移4个字符
ch = fgetc(pf);
printf("相对于当前位置向前面偏移4个字符:%c \n", ch);//这里打印的应该是b
printf("当前位置相对于起始位置偏移量为:%d\n", ftell(pf));
//当前文件光标位于b的后面
fseek(pf, 10, SEEK_SET);//相对于起始位置偏移10个字符
ch = fgetc(pf);
printf("相对于起始位置偏移10个字符:%c \n", ch);//这里应该打印的是k
printf("当前位置相对于起始位置偏移量为:%d\n\n", ftell(pf));
rewind(pf);
printf("当前位置相对于起始位置偏移量为:%d\n", ftell(pf));
fclose(pf);
pf = NULL;
return 0;
}
看下结果:
谢谢点赞!
欢迎留言讨论。