C语言之文件操作(上)

C语言之文件操作(上)

1. 什么是⽂件?

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

1.1 程序⽂件

  程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)

1.2 数据⽂件

  ⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件

1.3 ⽂件名

  ⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀

例如: c:\code\test.txt

为了⽅便起⻅,⽂件标识常被称为⽂件名

2. ⼆进制⽂件和⽂本⽂件

数据⽂件又被称为⽂本⽂件或者⼆进制⽂件

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

字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储

例如:10000如果以ASCII形式存储,则磁盘占5个字节(一个字符为1个字节),而以二进制形式存储,则磁盘占4个字节(一个整型)
在这里插入图片描述

ASCII形式存储:将每个字符转为对应的ASCII值,在将对应ASCII值转为二进制
二进制形式存储:将值转为二进制形式

3. ⽂件的打开和关闭

3.1 流和标准流

3.1.1 流

  在输入/输出数据的时候会输入/输出到不同的设备中,不同设备的输入/输出是以不同的方式的,为了方便程序员的操作,我们抽象出了流的概念,我们可以把流想象成流淌字符的河流

⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作

3.1.2 标准流

C语言在程序启动时,默认开打了三种流:
stdin — 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据

stdout — 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中

stderr — 标准错误流,⼤多数环境中输出到显⽰器界⾯

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

stdinstdoutstderr三个流的类型是: FILE*,通常称为⽂件指针。
C语⾔中,就是通过FILE* 的⽂件指针来维护流的各种操作的

4. ⽂件指针

  缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE

在VS2013编译环境提供的 stdio.h 头⽂件中有以下的⽂件类型申明:

struct _iobuf {
 char *_ptr;
 int _cnt;
 char *_base;
 int _flag;
 int _file;
 int _charbuf;
 int _bufsiz;
 char *_tmpfname;
 };
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异

  不用关系这段代码是如何实现的,当我们打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关⼼细节

5. 文件的打开与关闭

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

ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件

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

filename为文件的路径
mode为打开方式(只读,只写,…)
stream 为文件指针

mode模式有以下几种:

在这里插入图片描述

注意:

  1. 当任意读取文件的方式读取不存在的文件时,将会报错
  2. 打开文件也是有返回值的,当打开失败会返回一个NULL指针,所以最好对返回值进行判断
  3. 和动态内存管理相似,开辟空间需要free释放,同理打开文件也需要关闭文件fclose,并且将文件指针置NULL
    示例:
#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt","r");//只读方式打开文件
	fclose(pf);//关闭文件
	return 0;
}
  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

4U247

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值