IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 详解文件操作(细致总结) -> 正文阅读

[C++知识库]详解文件操作(细致总结)

目录

什么是文件?

1.程序文件

2.数据文件

3.文件名

文件的打开和关闭

1.文件指针

2.文件的打开和关闭

?文件的顺序读写

1.fputc 字符输出函数??

?2.fgetc 字符输入函数

3.fputs?文本行输出函数

4.fgets 文本行输入参数?

5.fprintf 格式化输出函数

?6.fscanf 格式化输入函数

7.fwrite 二进制输出函数

?8.fread 二进制输入函数

文件随机读写

1.fseek函数(根据文件指针的位置和偏移量来定位文件指针)

?2.ftell函数(返回文件指针相对于起始位置的偏移量)

3.rewind函数(让文件指针的位置回到文件的起始位置)

文本文件和二进制文件

文件读取结束的判断

?文件缓冲区


什么是文件?

磁盘上的文件是文件,但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件

1.程序文件

源文件(后缀为.c),目标文件(后缀为.obj),可执行程序(后缀为.exe)

2.数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,
或者输出内容的文件

3.文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用,文件标识被称为文件名

文件名包含:文件路径+文件名主干+文件名后缀

例如 c:\code\test.txt

文件的打开和关闭

1.文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便

我们试着创建一个FILE*指针变量

FILE* pf;//文件指针变量pf

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区,通过该文件信息区中的信息就能够访问该文件,也就是说通过文件指针变量能够找到与它关联的文件


2.文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件

规定打开文件使用fopen库函数,关闭文件用fclose库函数

参数为(文件名,打开方式);

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建议一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

?1.相对路径

?2.绝对路径

?注意fopen函数打开文件可能会失败所以要对返回值进行判断

FILE* pf = fopen("test.txt", "w");//打开文件
if (pf == NULL)
{
	exit(-1);
}

?了解了打开文件我们来看看如何关闭文件

参数(创建的FILE*类型变量)

fclose(pf);//关闭文件
pf = NULL;

?文件的顺序读写

?

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

1.fputc 字符输出函数
?

?参数(输入的字符,流)

?fputc('a', pf);

fputc('a',stdout);

?2.fgetc 字符输入函数

fgetc(pf);

fgetc(stdin);

?注意:fgetc函数成功则返回字符对应的ASCII码值,失败则返回EOF

3.fputs?文本行输出函数

?参数(要输入的字符串,流)

fputs("hello world\n", pf);
fputs("hello world\n", stdout);

4.fgets 文本行输入参数?

?参数(读取后保存的位置,读取最大字符数,流)

注意参数中读取最大字符数实际要减一,读取结束返回NULL

fgets(buff, 10, pf);
fgets(buff, 10,stdin);

知道了以上文件操作函数我们试着写一个文件拷贝

int main()
{
	FILE* pr = fopen("test.txt", "r");
	if (pr == NULL)
	{
		printf("open for reading:%s", strerror(errno));
		return 0;
	}
	FILE*pw = fopen("test1.txt", "w");
	if (pw == NULL)
	{
		printf("open for writing:%s", strerror(errno));
		fclose(pr);
		pr = NULL;
		return 0;
	}
	int ch = 0;
	while ((ch = fgetc(pr)) != EOF)
	{
		fputc(ch, pw);
	}
	fclose(pw);
	pw = NULL;
	return 0;
}

5.fprintf 格式化输出函数

?参数(流,格式化控制参数)

?

?6.fscanf 格式化输入函数

参数(流,格式化控制参数)?

int main()
{
	struct stu s = { 0 };
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	fscanf(pf,"%s %d %lf", s.name, &(s.age), &(s.result));
	printf("%s %d %f", s.name, s.age, s.result);
	fclose(pf);
	pf = NULL;
}

7.fwrite 二进制输出函数

参数(要被写的数据(指针),元素大小,元素个数,流)

int main()
{
	struct stu s = { "张三",12,56.99};
	FILE* pf = fopen("test1.txt", "wb");
	if (pf == NULL)
	{
		return 0;
	}
	fwrite(&s,sizeof(s),1,pf);
	fclose(pf);
	pf = NULL;
}

?8.fread 二进制输入函数

?参数(数据存储位置,元素大小,元素个数,流)

文件随机读写

1.fseek函数(根据文件指针的位置和偏移量来定位文件指针)

SEEK_CUR 文件指针当前位置

SEEK_END? 文件末尾位置

SEEK_SET 文件起始位置

参数(流,偏移量,偏移起始位置)

?2.ftell函数(返回文件指针相对于起始位置的偏移量)

??

3.rewind函数(让文件指针的位置回到文件的起始位置)

rewind(pf);//?fseek(pf, 0, SEEK_SET);同理

文本文件和二进制文件

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

文件读取结束的判断

feof和ferror函数不能用来判断文件是否结束而是应用于文件读取结束时,判断是读取失败结束还是遇到文件末尾结束

fgetc函数在读取结束时会返回EOF,正常读取时返回读取到的字符的ASCII码值

fgets函数在读取结束时会返回NULL,正常读取时返回存放字符串空间的起始地址

fread函数在读取时返回实际读取到的完整元素个数,如果发现读取到的完整元素个数小于指定元素个数,这就是最后一次读取

?举个例子

int main()
{
	FILE* pf = fopen("test.txt", "r");
	int ch = 0;
	if (pf == NULL)
	{
		return EXIT_FAILURE;
	}
	while ((ch=fgetc(pf))!=EOF)
	{
		putchar(ch);
	}
	if (feof(pf))
	{
		printf("\n文件正常结束\n");
	}
	else if (ferror(pf))
	{
		printf("\n文件非正常结束\n");
	}
}

文件缓冲区

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

int main()
{
	FILE*pf = fopen("test.txt", "w");
	fputs("abcdef", pf);
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
	Sleep(10000);
	//fclose(pf);
	pf = NULL;
	return 0;
}

这里可以得出一个结论
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件如果不做,可能导致读写文件的问题

3种情况下缓冲区刷新

1.缓冲区满时

2.遇到换行符‘\n’

3.需要输入时候或者程序终止

以上就是有关文件操作的详细总结,觉得可以的还请点赞评论蟹蟹

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:14:26  更:2022-03-12 17:16:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:46:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码