`
bcyy
  • 浏览: 1827755 次
文章分类
社区版块
存档分类
最新评论

标准IO简单介绍

 
阅读更多

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个流;

标准输入 0 STDIN_FILENO stdin
标准输出 1 STDOUT_FILENO stdout
标准错误输出 2 STDERR_FILENO stderr

分享到:
评论

相关推荐

    多路复用IO的简单实现

    多路复用IO的简单实现,可以分别处理标准输入和TCP连接请求

    java_io详解

    Java的核心库java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。此外,Java也对块传输提供支持,在核心库java....

    使用IO包复制文件

    其实用IO包复制文件很简单,学过这个的一般都能理解,我上传主要是为了获得积分,供自己下载,希望大家能支持!!!!

    用C++实现简单的文件IO操作

    但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。  如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部 分,首先声明一个类对象。 ...

    IO-Link通信从站的设计

    IO-Link是独立于任何现场总线,适用于工业控制层的简单传感器和执行器的工业通信接口。IO-Link系统包含IO-Link设备(如传感器、执行器)、IO-Link主站和标准传感器用电缆,系统结构如图1所示。例如,当一个兼容...

    DirectIO:用于Arduino的快速,简单的IO库

    简单的API:只需创建图钉对象。 分配给引脚执行写操作,使用其值执行读操作。 比较 标准的Arduino I / O库(接线)并不是特别快。 存在几个促成问题,但是它们主要源于在运行时指定的引脚号。 这可能很有用,但是...

    再读标准IO中的读函数

     在标准IO中,对于文件的读写无非三种方式:  (1) 每次一个字符的I / O。  (2) 每次一行的I / O。  (3) 直接I / O。  似乎这些函数看起来很简单,但只有理解了这些函数,你才知道该如何使用,例如怎样来...

    EDA/PLD中的再读标准IO中的读函数

     在标准IO中,对于文件的读写无非三种方式:  (1) 每次一个字符的I / O。  (2) 每次一行的I / O。  (3) 直接I / O。  似乎这些函数看起来很简单,但只有理解了这些函数,你才知道该如何使用,例如怎样来...

    PROFINET IO 网络拓扑

    其中 PDEV 来源于 PNO 标准的以太 网接口/端口描述。其中包括 IP/MAC 地址,诊断,FO 属性,冗余,同步,邻接,参数化 等。对于支持 PDEV 的设备和不支持 PDEV 的设备,在 Step7 硬件组态中可以查看两者之 间的差异...

    01.什么是Linux系统编程 02. Linux系统编程的基本框架

    linux系统编程 Linux系统编程也叫Linux下的高级编程; 学习Linux系统编程C语言是基础,能够在Linux系统下通过指令完成文件的创建、复制...所以在任何操作系统下,使用标准IO,也就是C库函数操作文件的方法都是相同的。

    IO-AD-.rar_IO A/D_io ad

    A/D 转换的MCU 就能极好地实现,但是也可以使用一些经济的外部器件,由一个标准的数 字I/O 口来实现一个简单的模数转换功能

    python编程例子输入输出-python基础教程:输入和输出(IO).pdf

    编程时,关于IO有两个基本概念:标准输⼊(STDIN)和标准输出(STDOUT)标准输⼊和输出都是对于命令⾏编程(⾮图形化界⾯) 的,简单来说,标准输⼊就是在命令⾏通过敲打键盘输⼊,标准输出就是打印到显⽰器。...

    tam-drawio:一个提供TAM标记的drawio插件

    概念,工作关系,由Deutsches Institut Fur Normung EV(德国国家标准),1992年3月1日) 有关TAM表示法的更多信息,请参见draw.io是基于Web的图表工具的开源。 可以下载它作为桌面应用程序运行,也可以从 该插件向...

    base-io-access:包含在 base 中的 IO 函数被分隔成小的、可组合的类,以安全地限制 IO 函数

    这个库的动机是允许人们制定比简单地“这个函数执行 IO”更严格的契约,并通过类型系统准确表达正在执行的 IO。 执行 使用的方法是创建一个隐蔽的类,将IO操作组分解为更小的子组。 举个例子: class Access io =...

    jihyerish.github.io:使用网络标准的简单演示

    使用Web标准API的样本 Hong Jihye Hong(@jihyerish)创建的演示 CSS Houdini API演示 滚动演示 焦点演示 Web演示中的观察者 媒体

    fuz.io:简单的浏览器到浏览器文件传输Webapp

    Fuz.io是Node.js中的一个简单的文件传输/云托管应用程序。 基本思想是,不必等待您的朋友完全上传可以开始下载的文件,这并不是一件有趣的事情。 如果您要处理大文件,那将是疯狂的时间浪费,但这是大多数其他基于...

    metronic:支持可插拔IO适配器的简单度量标准收集器

    提供一个简单的API,用于收集可以集成到不同度量/遥测库中的计时信息和计数器。 基本原理 我们希望能够利用Graphite之类的功能,而又不将其作为具体的依赖项引入我们所有共享库中。 这似乎是支持Graphite的一种简单...

    bruit-io bruit.iobruit-io-收集有关屏幕截图和技术数据的反馈,并将其发布到bruit.io之类的API中。-Vue.js开发

    在所有支持Web组件的框架(例如bruit.io)上,该工具均可以遵循Web组件标准来获取用户反馈,并且设计为尽可能简单易用。 用户的反馈将直接发送到您喜欢的项目管理工具:party_popper:。 bruit.io是围绕开放源Web组件...

    board-io:可以实时共享的简单绘图板!

    板IO正在开发中可以与同行共享的简单绘图板特征超级简单的连接* 无需服务器创建房间并轻松加入已知的问题为所有设备制作标准画布尺寸调整窗口大小,清除页面笔触。演示版 使用和P2P库

    通信与网络中的IO-Link通信从站的设计

    IO-Link是独立于任何现场总线,适用于工业控制最底层的简单传感器和执行器的工业通信接口。IO-Link系统包含IO-Link设备(如传感器、执行器)、IO-Link主站和标准传感器用电缆,系统结构如图1所示。例如,当一个兼容...

Global site tag (gtag.js) - Google Analytics