C语言文件操作

目录

什么是文件

文件名

数据文件

数据文件在内存中的存储

标准流

文件的打开和关闭

文件的打开模式:

顺序读写函数:

练习


什么是文件

磁盘(硬盘)上的文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类
的)。

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

有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

文件名

数据文件

数据文件被称为二进制文件或者文本文件
 
1. 二进制文件:数据在内存中以二进制的形式存储,不加转换的输出到外存的文件中就是二进制文件。
2. 文本文件:在存储前转换,在外存上以ASCII码值的形式存储。

数据文件在内存中的存储

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

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出 操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

标准流

在一个C程序中,C语言默认启动三个流

scanf就是从标准输入流中读取数据,printf将信息输出到标准输出流

这三个流的类型是:FILE*,称为文件指针类型

文件的打开和关闭

对文件的操作包括:1、打开文件  2、对文件进行写入或读取   3、关闭文件

ANSI C规定使用fopen函数来打开文件,fclose来关闭文件

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

文件的打开模式:

mode表示文件的打开模式,下面都是文件的打开模式:

⽂件使⽤⽅式
含义
如果指定⽂件不存在
“r”(只读)
为了输入数据,打开⼀个已经存在的文本文件
出错
“w”(只写)
为了输出数据,打开⼀个⽂本⽂件
建⽴⼀个新的⽂件
“a”(追加)
向文本文件尾添加数据
建⽴⼀个新的⽂件
“rb”(只读)
为了输⼊数据,打开⼀个⼆进制⽂件
出错
“wb”(只写)
为了输出数据,打开⼀个⼆进制⽂件
建⽴⼀个新的⽂件
“ab”(追加)
向⼀个⼆进制⽂件尾添加数据
建⽴⼀个新的⽂件
“r+”(读写)
为了读和写,打开⼀个⽂本⽂件
出错
“w+”(读写)
为了读和写,建议⼀个新的⽂件
建⽴⼀个新的⽂件
“a+”(读写)
打开⼀个⽂件,在⽂件尾进⾏读写
建⽴⼀个新的⽂件
“rb+”(读写)
为了读和写打开⼀个⼆进制⽂件
出错
“wb+”(读
写)
为了读和写,新建⼀个新的⼆进制⽂件
建⽴⼀个新的⽂件
“ab+”(读
写)
打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写
建⽴⼀个新的⽂件

顺序读写函数:

文件打开后,对文件进行操作有许多的函数如下:

以下函数读者可以去这个网站Reference - C++ Reference (cplusplus.com)自行去了解

函数名
功能
适⽤于
fgetc
字符输⼊函数
所有输⼊流
fputc
字符输出函数
所有输出流
fgets
⽂本⾏输⼊函数
所有输⼊流
fputs
⽂本⾏输出函数
所有输出流
fscanf
格式化输⼊函数
所有输⼊流
fprintf
格式化输出函数
所有输出流
fread
⼆进制输⼊
⽂件
fwrite
⼆进制输出
⽂件

练习

将文件information.txt中的数据复制到文件copy_information.txt中去:

按上图所示先在这个项目的路径下创两个文件夹, information.txt文件 是 copy_information.txt 文件的复制数据的对象,copy_information.txt 文件作为一个空文件,information.txt文件中随便输入一些数据,这里举例输入Hello world

//fgets函数与fputs函数
#include <stdio.h>

int main() {
	FILE* fp1 = fopen("information.txt", "r");//读
	FILE* fp2 = fopen("copy_information.txt", "w");//写
	char str[30];
	if (fp1 != NULL) {
		fgets(str, 30, fp1);//读出fp1流中的30个字节大小的数据存放到数组str中
		fputs(str, fp2);//将数组str中的数据存放到流fp2中
	}
	perror("");
	if (fp1 != NULL)
		fclose(fp1);
	fclose(fp2);
	return 0;
}

运行上述代码可发现, information.txt 文件中的内容成功复制到了copy_information.txt 文件中去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值