磁盘上的文件就是文件
在程序设计中,我们涉及到的 文件就2种:程序文件,数据文件(是以文件功能来划分的)
程序⽂件包括:源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。
⽂件的内容不⼀定是程序,⽽是程序运⾏时读,写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\ test.txt
为了⽅便起⻅,⽂件 标识常被称为⽂件名。
如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤ ⽂件。
以数据的使用形式把数据文件划分为:二进制文件和 文本文件
数据 在内存上以二进制形式存储,在输出时不需要转换,就称之为二进制文件
在外存上以ASCII码的形式存储,需要在存储前需要转换,就称之为文本文件
一个数据是如何存储的?
对于字符而言:一律用ASCII的形式存储:对于数值类型的:可以用ASCII也可以用对应的二进制
4.1流和标准流
流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后进行相应的操作
标准流
或许有人会有疑惑,那为什么我们在写程序 时,没有打开流呢???
这是因为C语⾔程序在启动的时候,默认打开了3个流:
• stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯。
• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
stdin、stdout、stderr三个流的类型是: FILE* ,通常称为⽂件指针。
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。
4.2)文件指针
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名FILE.
⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,也就是说,通过⽂件指针变量能够间接找到与 它关联的⽂件。
4.3)文件的打开与关闭
⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。 在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系,ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose函数 来关闭⽂件。
//打开⽂件
FILE * fopen ( const char * filename, const char * mode ); // 参数:FILE类型指针;对文件进行哪种操作
//关闭⽂件
int fclose ( FILE * stream );
fopen() 原型:
第一个参数:要打开文件的名字 第二个参数:对这个文件进行什么操作
文件打开成功返回指向指向文件的地址,否则返回NULL
注意:
1)当以 “w” 的方式进行操作时,若文件不存在,会自动建一个新的文件;若文件存在会清空原来的文件;总而言之就是建一个新的文件
2)在对文件操作时, 一定要用双引号,而不能用单引号
咱上代码
#include
int main()
{
// 打开 data1.txt 这个文件(原来是有内容的)
FILE* p = fopen("data1.txt", "w"); // 以写的方式打开
if (p == NULL)
{
perror("fopen\n"); // 报错
}
// 关闭文件
fclose(p);
p = NULL;
return 0;
}
程序运行前的:
程序运行后的:
5.1)文件顺序读写函数的介绍
以 fgetc() 为例:
fgetc() 函数原型:
fgetc() 这个函数就相当于getchar() :它们都是每次只读一个字符,当有多个字符时,会自动读取上一个被读走字符的下一个字符
既然有读取字符的那么就有输入字符的,比如我们的 fputc()
fputc() 参数:第一个是要输入的一个字符(注意要用单引号)
返回值:成功的话会返回被写入的字符会返回;否则返回EOF(-1)
#include
int main1()
{
// 文件内容拷贝
FILE* pread = fopen("data1.txt", "r"); // 以读的方式打开
if (pread == NULL)
{
perror("fopen-1\n");
return 1;
}
FILE* pwrite = fopen("data2.txt", "w"); // 以写的方式打开
if (pwrite == NULL)
{
perror("fopen-2\n");
fclose(pread);
pread = NULL;
return 1;
}
int ch = 0;
while ((ch = fgetc(pread)) != EOF) // 功能:一次读一个字符 参数:文件类型指针 返回值:int
{
fputc(ch, pwrite); // 功能;一次写一个字符 参数:要写的内容;写在哪个空间
}
fclose(pread);
pread = NULL;
fclose(pwrite);
pwrite = NULL;
return 0;
}
其他的读写函数同他们是一样的,我相信会用fputc() fgetc() ,剩下的咱也不在话下
6.1)fseek()
根据⽂件指针的位置和偏移量来定位⽂件指针。
参数:
第一个是指向文件类型的指针;
第二个:偏移量;
第三个是:起始位置(有3种情况)
6.2) rewind() 功能:让文件指针的位置回到文件的起始位置
void rewind (FILE*stream)
7.1)feof
在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件是否结束。
feof 的作⽤是:当⽂件读取结束的时候,判断文件读取结束的原因是否是:遇到⽂件尾结束。
⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
7.2)二进制文件
⼆进制⽂件的读取结束的判断:判断返回值是否⼩于实际要读的个数
ANSIC 标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓 冲区的⼤⼩根据C编译系统决定的。
以上就是本次我要share 的一些内容,若有不足之处,欢迎各位大佬们随时指正
咱也就是说,既然都来到这了,劳驾各位大佬们动动手指,点个赞,互关一下呗,赠人之赞,手留余香!!!