个人主页:勇敢的小牛儿
推荐专栏:C语言知识点
⚠️座右铭⚠️:敢于尝试才有机会
今日鸡汤:
你受的苦 吃的亏
担的责 扛的罪 忍的痛 到最后都会变成光 照亮你的路!!!
作用:通过文件指针的偏移量来定位文件指针。
函数原型:
1.1.1:FILE*stream
一个文件流,这是读取的对象
1.1.2:long offset
偏移量:相当于一个设置了一个步长,这个参数可以命令读取那一个数据。
1.1.3:int origin
1.SEEK_SET:表示从文件流的的开始位置读取。
2.SEEK_CUR:表示从文件流的当前位置读取。
3.SEEK_END:表示从文件流的的末尾开始读取。
:
#include
int main() {
//打开文件:以写的方式打开
FILE* pf = fopen("test.dat", "w");
//判断文件是否打开成功
if (pf == NULL) {
perror("pf fopen:");
return 1;
}
//打开成功就往文件里面写入:abcdef字符串
fputs("abcdef", pf);
//关闭文件
fclose(pf);
//将pf置为空指针
pf = NULL;
//以读的方式打开文件
FILE* ptr = fopen("test.dat", "r");
//判断文件打开是否成功
if (ptr == NULL) {
perror("fptr open:");
return 1;
}
//读取文件里的字符并打印
char ch = 0;
ch = fgetc(ptr);
printf("%c ",ch );
ch = fgetc(ptr);
printf("%c ", ch);
ch = fgetc(ptr);
printf("%c ", ch);
ch = fgetc(ptr);
printf("%c ", ch);
fclose(ptr);
ptr = NULL;
return 0;
}
打印结果:
a b c d
文件流指针的情况:在打印了最后一个d以后,文件流指针指向了d这个元素。
当我们再次想要打印a这个元素的时候我们便可以使用fseek函数:
//从当前位置开始
fseek(ptr, -4, SEEK_CUR);
ch = fgetc(ptr);
printf("%c ", ch);
//从起始位置开始
fseek(ptr, 0, SEEK_SET);
ch = fgetc(ptr);
printf("%c ", ch);
//从末位置开始
fseek(ptr, -6, SEEK_END);
ch = fgetc(ptr);
printf("%c ", ch);
输出:a a a
这个函数的作用是获取文件流当前的位置,他在获取了文件流的位置以后会返回一个整型,这个整型就是文件流相对于文件流开始位置的偏移量。
函数原型:
2.1:参数:
文件流:FILE*stream
int main() {
//打开文件:以写的方式打开
FILE* pf = fopen("test.dat", "w");
//判断文件是否打开成功
if (pf == NULL) {
perror("pf fopen:");
return 1;
}
//打开成功就往文件里面写入:abcdef字符串
fputs("abcdef", pf);
//关闭文件
fclose(pf);
//将pf置为空指针
pf = NULL;
//以读的方式打开文件
FILE* ptr = fopen("test.dat", "r");
//判断文件打开是否成功
if (ptr == NULL) {
perror("fptr open:");
return 1;
}
//让文件指针动
char ch = 0;
ch = fgetc(ptr);
ch = fgetc(ptr);
ch = fgetc(ptr);
ch = fgetc(ptr);
//计算偏移量
int n =ftell(ptr);
printf("%d\n", n);
fclose(ptr);
ptr = NULL;
return 0;
}
输出:4
这个函数的作用是让文件流重新回到文件流开始的位置,具有重置作用。
函数原型:
FILE*stream
:
//计算偏移量
int n =ftell(ptr);
//加一个rewind函数
rewind(ptr);
//再次计算偏移量
n = ftell(ptr);
printf("%d\n", n);
输出:0
作用:在文件读取结束以后查找文件读取结束的原因:
1.文件读取到了末尾返回了EOF/NULL。
2.文件读取过程中发生了错误。
函数原型:
检查原理:发生错误就返回一个0。如果没有发生错误就返回一个非0的数。
函数原型:
使用:
:
#include
#include
int main(void)
{
int c; // 注意:int,非char,要求处理EOF
FILE* fp = fopen("test.dat", "r");
if (!fp) {
perror("File opening failed");
return EXIT_FAILURE;//c语言定义的一个数,大小为1
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
puts("End of file reached successfully");
fclose(fp);
}
输出: End of file reached successfully
ANSIC 标准采用 “ 缓冲文件系统 ” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块 “ 文件缓冲区 ” 。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据 C 编译系统决定的。
作用:计算机内缓冲区的设置的目的是为了提高数据的读取效率。
代码:
#include
#include
int main() {
FILE* pf = fopen("test.dat", "w");
if (!pf) {
perror("fopen:");
return 1;
}
fputs("abcdef", pf);
printf("睡眠十秒,已经在开始写数据了\n");
Sleep(10000);
fflush(pf);
printf("睡眠十秒,打开文件,文件中有数据了。\n");
Sleep(10000);
fclose(pf);
pf = NULL;
return 0;
}
感兴趣的读者可以将这段代码在自己的编译器上运行一下。感受一下缓冲区!!!
小牛儿今天的分享就到这里了,感谢你的阅读!!!