C语言学习笔记(18)文件操作2

Posted 小倪同学 -_-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习笔记(18)文件操作2相关的知识,希望对你有一定的参考价值。

五.文件的随机读写

fseek


根据文件指针的位置和偏移量来定位文件指针。

#include<stdio.h>
int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if (pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 
	fputs("abcdef", pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if (pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件 - abcdef
	int ret = fgetc(pf2);
	printf("%c\\n", ret);
	//调整文件指针
	//fseek(pf2, -1, SEEK_CUR);//a a b -  从文件指针当前位置偏移-1 
	//fseek(pf2, 2, SEEK_SET);//a c d - 从文件开头的位置a偏移2
	fseek(pf2, -3, SEEK_END);//a d e - 从文件结尾的位置向前偏移3
	ret = fgetc(pf2);
	printf("%c\\n", ret);
	ret = fgetc(pf2);
	printf("%c\\n", ret);

	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;
}

ftell

返回文件指针相对于起使位置的偏移量

int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if (pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 
	fputs("abcdef", pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if (pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件 - abcdef
	int ret = fgetc(pf2);
	printf("%c\\n", ret);//a
	ret = fgetc(pf2);
	printf("%c\\n", ret);//b
	ret = fgetc(pf2);
	printf("%c\\n", ret); //c
	//计算当前文件指针位置相对于起始位置的偏移量
	int set = ftell(pf2);
	printf("%d\\n", set);//3 - c对于起始位置偏移量为3

	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;
}

rewind

让文件指针的位置回到文件的起始位置

#include<stdio.h>
int main()
{
	FILE* pf1 = fopen("FirstFile.txt", "w");
	if (pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 
	fputs("abcdef", pf1);
	//关闭文件 
	fclose(pf1);
	pf1 = NULL;
	
	FILE* pf2 = fopen("FirstFile.txt", "r");
	if (pf2 == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件 - abcdef
	int ret = fgetc(pf2);
	printf("%c\\n", ret);//a
	ret = fgetc(pf2);
	printf("%c\\n", ret);//b
	ret = fgetc(pf2);
	printf("%c\\n", ret); //c
	int set = ftell(pf2);
	printf("%d\\n", set);//3
	//让文件指针回到起始位置
	rewind(pf2);
	ret = fgetc(pf2);
	printf("%c\\n", ret);//a
	set = ftell(pf2);
	printf("%d\\n", set);//1

	//关闭文件 
	fclose(pf2);
	pf2 = NULL;
	return 0;
}

六.文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储, 数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节), 而二进制形式输出,则在磁盘上只占4个字节(VS2013测试) 。


以ASCII码的形式输出

以二进制形式输出


按上面方式打开可得到

用计算器验证一下,结果无误

注意:该程序是小端存储

七.文件读取结束的判定

错误的使用feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

1.文本文件读取是否结束,判断返回值是否为EOF ( fgetc),或者NULL ( fgets )

  • fgetc判断是否为EOF
  • fgets判断返回值是否为NULL

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

  • fread判断返回值是否小于实际要读的个数

拷贝一份文件

将test1.txt文件拷贝一份生成test2.txt

int main()
{
	FILE* pfread = fopen("test1.txt", "r");
	if (pfread == NULL)
	{
		perror("fopen");
		return 1;
	}
	FILE* pfwrite = fopen("test2.txt", "w");
	if (pfwrite == NULL)
	{
		perror("fopen");
		fclose(pfread);
		pfread = NULL;
		return 1;
	}
	//读写文件
	int ch = 0;
	while ((ch = fgetc(pfread)) != EOF)//读
	{
		fputc(ch, pfwrite);//写
	}
	if (feof(pfread))//如果遇到文件结束,它会返回一个非0的值
	{
		printf("遇到文件结束标志,文件正常结束\\n");
	}
	else if (ferror(pfread))//ferror返回非0,表示文件读取失败
	{
		printf("文件读取失败\\n");
	}
	//关闭文件 
	fclose(pfread);
	pfread = NULL;
	fclose(pfwrite);
	pfwrite = NULL;
	return 0;
}


八.文件缓冲区

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

以上是关于C语言学习笔记(18)文件操作2的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

C语言笔记C语言文件操作全解

Linux内核分析——第三周学习笔记20135308

python学习笔记 18-4-11

反射机制入门

反射机制入门