标准IO简单介绍

本文介绍了文件的基本概念,包括文件的定义、分类以及标准IO流的使用。详细解释了文件指针FILE的作用,流的概念及其分类,并探讨了标准IO库如何通过缓存机制提升IO效率。

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

1 文件的概念

定义:

1)文件:一组数据的有效集合;

2)文件名:数据集合的名称;

按类型分类:

常规文件 ”-“ 、目录"D"、字符设备“C”、块设备“B"、套接字”S" 、符号链接“L"、管道”P"。

标准IO 流及FILE对象

1)文件指针

FILE指针:每个被使用的文件都在内存中开辟一个空间,用来存放这个文件的有关信息,这些信息保存在一个结构体类型的变量中,该结构体的变量是有系统定义的。取名为FILE; 在标准库中,所有的操作都是围绕流(stream)来进行的,在标准IO中,流用FILE *来描述;

在 /usr/include/libio.h 中声明了 struct _IO_FILE 结构体,在/usr/include/stdio.h 第49行被重定义为 typedef struct _IO_FILE FILE;

2)流(stream)

定义:所有的IO操作都是简单的从程序的移进和移出,这种字节流成为流;。流分为二进制流和文本流;

3)文件缓冲

我们知道引入标准IO库的目的是为了提高IO的效率,避免频繁的进行read/write系统调用,而系统调用会消耗较多的资源。因此标准IO库引入了IO缓存,通过累积一定量的IO数据后,然后集中写入到实际的文件中来减少系统调用,从而提高IO效率。标准IO库会自动管理内部的缓存,不需要程序员介入。然而,也正是因为我们看不到标准IO库的缓存,有时候会给我们带来一定的迷惑性。这里介绍下标准IO库的缓存策略。

缓存分为:全缓存,行缓存(终端是典型的行缓存),不带缓存;

标准I/O的缓存--标准输出为例:(这里都是指缺省情况下)

1)当STDOUT连接到终端设备时,那么它就是行缓存的,也就是标准IO库没看到一个新行符 /n时就刷新一次缓存(即执行一次实际的输出操作)。这一特性可以通过如下测试代码来验证

int main()
{
printf("This Line Should be Cached...");
sleep(3);//这时候在终端上是看不到任何输出
printf("/nThis Line Should be Cached Again");//这时候可以看到第一个printf的输出,因为被换行符刷新了
sleep(3);//这时候也只能看到一行输出,而看不到第二个printf输出的
printf("This Line Should Not be Cached Again/n");//这时候可以看到第二个和第三个printf的输出,因为被结尾的/n刷新
sleep(3);
getchar();
}

2)当STDOUT被重定向到一个具体文件时,那么标准输出是全缓存的,也就是说只有当输出缓存被塞满或者调用fflush或fclose时才会执行实际的写入操作,这里就不给出具体例子,可以通过freopen将STDOUT重定向到一个具体文件来进行测试。

标准出错STDERR:为了尽快的看到出错信息,标准出错是不带任何缓存的;

验证缓存大小的程序:

#include <stdio.h>
#define M 0
#define N 1
//测试缓存区大小,341*3+1=1024;
int main()
{
#if M
	int i = 0;
	for ( i = 0; i < 379; i++)//每次向缓存写三个字符;
	{
		if (i >= 100)
			fprintf(stdout,"%d",i);
		else
			if (i >= 10)
				fprintf(stdout,"0%d",i);
			else
				if (i >= 0)
					fprintf(stdout,"00%d",i);
	}
	while(1);//强制执行,如果取消,程序结束时将会输出所有字符,看不到效果
#endif
#if N
	int i = 0;
	for(i = 0; i < 400;i++)
		fprintf(stdout,"%03d",i);
	while(1);
#endif

}


4)stdin stdout stderr

标准IO预定义了3个流,他们会自动地为进程打开,也就是打开终端默认打开3个流;

标准输入0STDIN_FILENOstdin
标准输出1STDOUT_FILENOstdout
标准错误输出2STDERR_FILENOstderr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值