目录
承接79.【C语言】文件操作(4)文章
文件的随机读写
1.fseek函数
声明:int fseek ( FILE * stream, long int offset, int origin );
格式:fseek(文件指针,偏移量,起始位置);
作用:根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)
类比Intel 8086汇编语言的 int10h中断便可理解fseek函数为什么要这样做
1.先设置光标位置
cppmov ah,2 ;int 10h的2号子功能:置光标 mov bh,0 ;第0页 mov dh,5 ;dh中放行号 mov dl,12 ;dl中放列号 int 10h
2.在光标位置显示字符
cppmov ah,9 ;int 10h的第9号子功能:在光标位置显示字符 mov al,'a';字符 mov bl,7 ;颜色属性 mov bh,0 ;第0页 mov cx,3 ;字符重复的个数 int 10h
起始位置的表格
|----------|-------------|
| 常量 | 位置 |
| SEEK_SET | 文件开始的位置 |
| SEEK_CUR | 文件指针当前指向的位置 |
| SEEK_END | 文件的末尾 |
提前建好data.txt,输入1234567,保存
代码示例
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* p = fopen("data.txt", "r");
if (p == NULL)
{
perror("fopen");
return 1;
}
int ch = fgetc(p);
printf("%c", ch);
fseek(p, 2, SEEK_CUR);
ch = fgetc(p);
printf("%c", ch);
fclose(p);
p = NULL;
return 0;
}
cpp
fseek(p, 2, SEEK_CUR);
含义是:从当前指针的位置开始算,偏移量为2
改成下方的代码,运行结果是一样的
cpp
fseek(p, 3, SEEK_SET);
含义是:从文件起始的位置开始算,偏移量为3
改成下方的代码,运行结果还是一样的
cpp
fseek(p, -3, SEEK_END);
含义是:从文件末尾的位置开始算,偏移量为-3
如果用图来说明的话:
将data.txt用HxD.exe(点我跳转至官网下载)打开
图里的Offset(h)是以十六进制显示的偏移量
如果将SEE_SET,SEEK_END标在上面的话
cpp
int ch = fgetc(p);
printf("%c\n", ch);
fseek(p, 0, SEEK_SET);
ch = fgetc(p);
printf("%c\n", ch);
两次打印的结果是一样的
运行结果
2.ftell函数
声明:long int ftell ( FILE * stream );
格式:ftell(文件指针);
作用:返回文件指针相对于起始位置的偏移量
代码示例
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* p = fopen("data.txt", "r");
if (p == NULL)
{
perror("fopen");
return 1;
}
long int ret = ftell(p);
printf("%ld\n", ret);
int ch = fgetc(p);
ret = ftell(p);
printf("%ld\n", ret);
fclose(p);
p = NULL;
return 0;
}
运行结果
3.rewind函数
声明:void rewind ( FILE * stream );
格式:rewind(文件指针);
作用:将文件指针恢复至初始位置
代码示例
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* p = fopen("data.txt", "r");
if (p == NULL)
{
perror("fopen");
return 1;
}
int ch = fgetc(p);
printf("%c\n", ch);
ch = fgetc(p);
printf("%c\n", ch);
ch = fgetc(p);
printf("%c\n", ch);
rewind(p);
ch = fgetc(p);
printf("%c\n", ch);
fclose(p);
p = NULL;
return 0;
}