C语言中的文件和文件操作

   老铁们,今天我分享简单的文件和文件操作。

       首先,在你眼中文件是什么?简单来讲,在磁盘上的⽂件是⽂件,它是将数据进⾏持久化的保存以便我们进调用和运行的工具。

      文件分为程序文件和数据文件。程序文件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)注意文件也可以没有后缀名。数据文件是运行时读写的数据。⼀个⽂件要有⼀个唯⼀的⽂件标识,以便用户识别和引用。 ⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀AS:c:\code\test.txt.这显示的是c盘下在Code库下的test的文本文件。如下图中:

.tlog,.ilk,.idb.我们也不必担心,这是VS下的一下文件

接下来,根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。以ASCII字符的形式存储的⽂件就是文本文件,使⽤⼆进制形式存储,如果不加转换的输出到外存,就是⼆进制文件,那如何分辨?,哈哈,我们可以用记事本打开,如果是我们可以看的懂就是文本文件,否则就是二进制文件。值得一提的是:数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。但是二者的存储空间不一样,如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节(VS2019测试)

第二,相信大家,都听过stdin,stdout,stderr.这其实是三种流的叫法,他们分别是标准输入流,标准输出流,标准错误流。当我们打开c语言程序时,一般都默认打开了这三个流,而这三个流的类型都是FILE*类型,通常叫做文件指针。而在后以面的学习预处理中预定符号中有__FILE__注意这二个不是一样的东西,这是显示文件路径的。

第三,⽂件的打开和关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。 在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。我们要用fclose关闭;AS:

函数原型

FILE *fopen(const char *filename, const char *mode);

  • filename-- 这是 C 字符串,包含了要打开的文件名称。

  • mode-- 这是 C 字符串,包含了文件访问模式。

以下是一些常见的一些fopen的一些模式:

字符串

说明

r

以只读方式打开文件,该文件必须存在。

r+

以读/写方式打开文件,该文件必须存在。

rb+

以读/写方式打开一个二进制文件,只允许读/写数据。

rt+

以读/写方式打开一个文本文件,允许读和写。

w

打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。

w+

打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。

a

以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。

a+

以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。

wb

以只写方式打开或新建一个二进制文件,只允许写数据。

wb+

以读/写方式打开或新建一个二进制文件,允许读和写。

wt+

以读/写方式打开或新建一个文本文件,允许读和写。

at+

以读/写方式打开一个文本文件,允许读或在文本末追加数据。

ab+

以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

第四,文件的顺序读写和随机读写,我们可以用图看一下。其实就是光标的位置!

文件的顺序读写,按光标顺序进行进行写包括以下一些常见的函数

从它们名字我们可以分为二二一组来讲;

fgets()函数:用于从文件中读取一行数据。它的原型是:char *fgets(char *str, int n, FILE *stream); 它从指定的文件流中读取一行数据,最多读取n-1个字符,并存储在字符串str中

fputs()函数:用于将一行数据写入文件。它的原型是:int fputs(const char *str, FILE *stream); 它将字符串str写入指定的文件流中

fscanf()函数:用于从文件中读取格式化输入。它的原型是:int fscanf(FILE *stream, const char *format, ...); 它从指定的文件流中读取格式化输入,并将结果存储在参数列表中

fprintf()函数:用于将格式化的输出写入文件。它的原型是:int fprintf(FILE *stream, const char *format, ...); 它将格式化的输出写入指定的文件流中。

fread()函数:用于从文件中读取二进制数据。它的原型是:size_t fread(void *ptr, size_t size, size_t count, FILE *stream); 它从指定的文件流中读取二进制数据,最多读取count个元素,每个元素的大小为size字节,并将结果存储在指针ptr指向的内存中。

fwrite()函数:用于将二进制数据写入文件。它的原型是:size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); 它将指针ptr指向的内存中的二进制数据写入指定的文件流中,最多写入count个元素,每个元素的大小为size字节。

文件的随机读写函数,按光标的位置进行进行写包括以下一些常见的函数

fseek(),rewind(),ftell() 这是对光标位置的调整;

参数为(那个流下,偏移量,起始位置)

起始位置:

fseek()函数:用于设置文件指针的位置。它的原型是:int fseek(FILE *stream, long offset, int whence); 它将文件指针移动到指定的位置,其中offset指定偏移量,whence指定起始位置(SEEK_SET表示文件开头,SEEK_CUR表示当前位置,SEEK_END表示文件结尾)。

rewind()函数:用于将文件指针重新设置到文件开头。它的原型是:void rewind(FILE *stream); 它将文件指针重新设置到文件开头。

ftell()函数:用于获取当前文件指针的位置。它的原型是:long ftell(FILE *stream); 它返回当前文件指针的位置。

最后,关于文件的结束:

1,feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

2,⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例子(我缩小代码了):

int main(void) { int c; // 注意:int,⾮char,要求处理EOF FILE* fp = fopen("test.txt", "r"); if(!fp) { perror("File opening failed"); return EXIT_FAILURE; } //fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环 { putchar(c); } //判断是什么原因结束的 if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) puts("End of file reached successfully"); fclose(fp);

值得一题的是:

文件缓冲区;

ANSIC码标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值