标准IO及缓存

本文详细介绍了文件的概念,包括文件的定义、磁盘文件的分类,以及标准IO的缓冲特性,如行缓冲、全缓冲和无缓冲。讨论了文件指针、打开和关闭文件的操作,以及如何一次读写字符和字符串。此外,还涵盖了读写文件、格式化读写、随机读写等函数的使用,重点强调了fprintf和sprintf在行缓存中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文件的概念

文件用来存放程序、文档、音频、视频数据、图片等数据的。

文件就是存放在磁盘上的,一些数据的集合。在windows下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员写的程序,对文件进行打开、显示、读写、关闭。作为一个程序员,必须掌握编程实现创建、写入、读取文件等操作对文件的操作是经常要用到的知识,比如:写飞秋软件传送文件等。

1.1 文件的定义

磁盘文件:(我们通常认识的文件)

指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。

设备文件

在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。

键盘:标准输入文件 屏幕:标准输出文件其它设备:打印机、触摸屏、摄像头、音箱等在Linux操作系统中,每一个外部设备都在/dev目录下对应着一个设备文件,咱们在程序中要想操作设备,就必须对与其对应的/dev下的设备文件进行操作。

文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要知道对文件操作的时候的一些缓冲特点即可。

文件IO(write等函数包含unistd.h这些头文件,他们可以直接写入到内核中):

 

标准IO(fwrite等函数,文件描述符0、1、2等标准输入输出函数,需要刷新库缓存缓存区才能把数据写到内核中):

1.行缓冲

标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区如果不刷新缓冲区,无法对文件执行读写操作。

行缓冲的刷新条件:

 #include <stdio.h>
 int main(int argc, char const *argv[])
 {
 //由于printf函数是一个标准io,所以只有刷新缓冲区才可以将数据输出到终端
 //printf("hello world");
 ​
 //刷新缓冲区方法1:使用\n
 //printf("hello world\n");
 ​
 //刷新缓冲区方法2:程序正常结束
 //printf("hello world");
 //return 0;
 ​
 //刷新缓冲区方法3:使用fflush函数刷新缓冲区
 //printf("hello world");
 //ffluash(FIFE *fp)
 //把库函数中的缓存内容强制写到内核中。
 //fflush:刷新函数。可以刷新指定的缓冲区
 //stdout:标准输出,就是对终端进行写操作
 //fflush(stdout);
 ​
 //刷新缓冲区方法4:当缓冲区满的时候自动刷新
 //默认行缓冲的大小为1024个字节
  int i;
  for(i = 1; i < 300; i++)
  {
  printf("%03d ", i);
  }
  while(1)
  ;
  return 0;
  }
  
 //刷新缓冲区方法5:关闭标准IO使用fclose函数
 //关闭一个文件流,使用fclose就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。

其实write函数包含了ffluash和fwrite总和的功能。

2.全缓冲

标准io库函数 ,往普通文件读写数据的,是全缓冲的,碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区。

刷新缓冲区的情况:

1.缓冲区满了,刷新缓冲区。

2.人为刷新缓冲区 fflush(文件指针)。

3.程序正常结束会刷新缓冲区。

3.无缓冲

无缓存 只要用户调这个函数,就会将其内容写到内核中

stderr(标准错误输出) 注意:标准输入和输出都是行缓存函数。

例:fputs(“hello”,stderr);

在读写文件的时候通过系统调用IO(read write),对文件进行读写数据这个时候是无缓冲的,即写数据会立马进入文件,读数据会立马进入内存。刷新缓存其实也就是立马把缓存区传递给内核进行读取,提高效率。

写文件的流程:

应用程序空间(用户空间)---内核空间 ---驱动程序---硬盘上。

应用程序和内核程序运行在不同的空间里,目的是为了保护内核。

设置缓冲区的目的

通过缓冲可以减少进出内核的次数,以提高效率。

1.2 磁盘文件的分类

一个文件通常是磁盘上一段命名的存储区计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储。

从用户或者操作系统使用的角度(逻辑上)把文件分为:

文本文件: 基于字符编码的文件。

二进制文件:基于值编码的文件。

文本文件

基于字符编码,常见编码有ASCII、UNICODE等,一般可以使用文本编辑器直接打开

例如:数5678的以ASCII存储形式为:

ASCII码:00110101 00110110 00110111 00111000

歌词文件(lrc):文本文件

二进制码文件

基于值编码,自己根据具体应用,指定某个值是什么意思,把内存中的数据按其在内存中的存储形式原样输出到磁盘上,一般需要自己判断或使用特定软件分析数据格式。

例如&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值