关于文件的一些小知识下

个人主页:勇敢的小牛儿

推荐专栏:C语言知识点

⚠️座右铭⚠️:敢于尝试才有机会

今日鸡汤:

你受的苦 吃的亏

担的责 扛的罪 忍的痛 到最后都会变成光 照亮你的路!!!

思维导图:

关于文件的一些小知识下_第1张图片​ 一,随机读取

1.fseek函数:

作用:通过文件指针的偏移量来定位文件指针。

函数原型:

​ 

1.1:参数

1.1.1:FILE*stream

一个文件流,这是读取的对象

1.1.2:long offset

 偏移量:相当于一个设置了一个步长,这个参数可以命令读取那一个数据。

1.1.3:int origin

1.SEEK_SET:表示从文件流的的开始位置读取。

2.SEEK_CUR:表示从文件流的当前位置读取。

3.SEEK_END:表示从文件流的的末尾开始读取。

1.2:使用

#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这个元素。

关于文件的一些小知识下_第2张图片

当我们再次想要打印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 

二.ftell函数

这个函数的作用是获取文件流当前的位置,他在获取了文件流的位置以后会返回一个整型,这个整型就是文件流相对于文件流开始位置的偏移量。

函数原型:

关于文件的一些小知识下_第3张图片

2.1:参数:

文件流:FILE*stream

3.使用:

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 

三.rewind函数:

这个函数的作用是让文件流重新回到文件流开始的位置,具有重置作用。

函数原型:

关于文件的一些小知识下_第4张图片

3.1参数:

FILE*stream

 3.2使用:

//计算偏移量
	int n =ftell(ptr);
	//加一个rewind函数
	rewind(ptr);
//再次计算偏移量
	n = ftell(ptr);
	printf("%d\n", n);

输出:0

二,feof函数与ferror函数

2.1:feof函数:

作用:在文件读取结束以后查找文件读取结束的原因:

1.文件读取到了末尾返回了EOF/NULL。

2.文件读取过程中发生了错误。

函数原型:

关于文件的一些小知识下_第5张图片

2.2:ferror函数:检查文件发生的错误。

检查原理:发生错误就返回一个0。如果没有发生错误就返回一个非0的数。

函数原型:

关于文件的一些小知识下_第6张图片 

使用:

#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

三,文件缓冲区:

3.1:缓冲区的概念:

ANSIC 标准采用 缓冲文件系统 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序
中每一个正在使用的文件开辟一块 文件缓冲区 。从内存向磁盘输出数据会先送到内存中的缓冲区,装
满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根
C 编译系统决定的。

作用:计算机内缓冲区的设置的目的是为了提高数据的读取效率。

3.2:计算机读取数据演示图:

关于文件的一些小知识下_第7张图片

3.3:缓冲区存在证明:

代码:

#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;
}

感兴趣的读者可以将这段代码在自己的编译器上运行一下。感受一下缓冲区!!! 

四,结语:

小牛儿今天的分享就到这里了,感谢你的阅读!!!

 

你可能感兴趣的:(c语言知识点,函数,开发语言,c语言,学习)