目录
- 一.文件的类型
- 1.数据文件
- 2.程序文件
- 3.文件名
- 二. 二进制文件
- 三.文本文件
- 四. 文件的打开(fopen)和关闭(fclose)
- 1.1流是什么
- 1.2标准流
- 2.文件指针
一.文件的类型
存储在硬盘上的是文件,文件分为数据文件和程序文件两种类型(根据功能不同分类的)
1.数据文件
数据文件是程序运行时读写的数据
例如:程序运行时需要从中读取数据的文件,
程序运行时需要从中写进数据的文件
数据文件被分为二进制文件和文本文件(根据数据类型不同分的)
2.程序文件
以windows为例,源文件是(.c) 目标文件是(.obj)
可执行程序是(.exe)
3.文件名
文件标识 == 文件名
文件名包含三个部分:文件路径+文件主干+文件后缀
例如:c:\code\test.txt
二. 二进制文件
数据在内存中以二进制的形式存储,不加转化地输出到外存,就是二进制文件
10000以二进制的形式存储占4个字节
三.文本文件
如果要求在外存上以ASCII码的形式存储,就需要在存储前转化。在外存中以ASCII码的形式存储的就是文本文件
10000以字符的形式存储占5个字节,因为10000有五位嘛
int main()
{
int a = 10000;
FILE* pf = fopen("test.txt", "wb");//打开文件
if (pf == NULL)//文件是空指针提前返回
{
perror("fopen");
return 1;
}
//写入
fwrite(&a,4,1,pf);//在vs上以二进制的形式写入文件中
fclose(pf);//关闭文件
pf = NULL;
return 0;
}
10000的16进制是:00 00 27 10
因为vs上是小端存储:低位的内容存在低地址上
10 27 00 00
四. 文件的打开(fopen)和关闭(fclose)
我们使用文件应该先打开文件,使用完后应该关闭文件
我们使用文件指针来建立文件和指针之间的关系
FILE* pf = fopen(const char*filename,const char* mode);
//filename表示要打开的文件,mode表示文件的打开方式
fclose(FILE* stream);
//stream表示要关闭指针指向的文件
//mode表示打开的模式,(例如以读的形式打开)
int main()
{
FILE* pf = fopen("test.txt", "r");//打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
//使用
//...
fclose(pf);//关闭文件
pf = NULL;
return 0;
}
1.1流是什么
流是抽象出来的一种概念,为了方便程序员读写文件
键盘、文件、硬盘向流中输入数据,我们就可以从流中获取数据
我们一般都是打开流,获取数据或输入数据,然后操作
1.2标准流
我们向键盘上输入数据,然后打印出了内容,为什么并没有打开流?
是因为C语言默认打开三个流:
stdin:标准输入流,大多数情况下用键盘输入,scanf都是从标准输入流中读取数据
stdout:标准输出流,大多数情况下都是输出到显示器界面的,printf输出到标准输出流中
stderr:大多数情况下都是把错误输出到显示器界面的
stdin、stdout、stderr其实是FILE*类型的,他们都是文件指针
int fprintf(FILE* stream,const char* p);
int printf(const char* p);
//printf和fprintf很相似
//向流中输入数据
int fscanf(FILE*stream,const char* p);
int scanf(const char* p);
//fcanf和fscanf也很相似
//fscanf是向流中读取数据
2.文件指针
文件指针本质上是一个结构体指针
每个被使用的文件都在内存中开辟一个文件信息区,这些文件信息保存在一个结构体变量中,该结构体变量是由系统声明的
下面以VS2013环境下头文件中的文件类型声明:
struct_iobuf
{
char*_ptr;
int _cnt;
char* _base;
int _flag;
int _charbuf;
int __bufsiz;
char* _tmpfname;
};
typedef struct _iobuf FILE;
我们以FILE*的指针来维护这个结构体
FILE* pf
我们用pf这个文件指针来指向某个文件的文件信息区(结构体变量),能通过文件信息区的信息可以访问这个文件,所以可以通过文件指针变量间接地访问与它有关联的文件
未完待续,敬请期待
创作不易,希望大家多多点赞