c语言 标准输入流

c语言 标准输入流,第1张

由于程序中经常有大量对文件输入输出 *** 作,它经常构成了程序的主要部分,因而C语言提供了很多输入输出的函数,它们分别用于两种类型文件输入输出系统:即由ANSI标准定义的缓冲文件(也称标准文件(流)输入输出(I/O)系统);另一类是ANSI标旅纯准中没有定义的非缓冲文件(也称非标准文件(流)输入输出(I/O)系统)。

我们已经熟悉了通过键盘和显示器进行输入输出的一些函数,如scanf(),printf()等等,这些通过控制台(键盘、显示器等)进行I/O的 *** 作,可以看作标准文件输入输出系统的一些特例,实际上在标准输入输出系统中的一些函数,有关文件的参数(文件结构指针或称流指针),只要用标准设备的流指针代替,这些标准输入输出函数即成为控制台I/O函数。在任何程序执行时,C系统都定义了5个标准设备文件可供使用。自动打开的5个标准设备文件的文件结构指针(在标准I/O系统中)和文件代号将有一个规定值:

设备 标准文件I/O系统中的流指针名 非标准文件……

键盘(标准输入) stdin 0

显示器(标准输出) stdout1

显示器(标准错误) stderr2

串行口(标准辅助) stdoux3

打印机(标准打印) stdprn4

这样,不论在标准文件系统还是非标准文件系统中,文件结构只要用上述的流指针或文件代号代替,则这些函数也均适用于控制台设备。

一、文本流和二进制流

在C中引入了流(stream)的概念。它将数据的输入输出看作是数据的流入和流出,这样不管是磁盘文件或者是物理设备(打印机、显示器、键盘等),都可看作一种流的源和目的,视他们为同一种东西,而不管其具体的物理结构,即对他们的 *** 作,就是数据的流入和流出。这种把数据的输入输出 *** 作对象,抽象化为一种流,而不管它的具体结构的方法很有利于编程,而涉及流的输出 *** 作函数可用于各种对象,与其具体的实体无关,即具有通用性。

在C中流可分为两大类,即文本流(text stream)和二进制流(binary stream)。所谓文本流是指在流中流动的数据是以字符形式出现。在文本流中,\'\\n\'被换成回车CR和换行LF的代码0DH和0AH。而当输出时,则0DH和0AH本换成\'\\n\'。

二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数表示。在流入流出时,对\\n符号不进行变换。例如2001这个数,在文本流中用其ASCII码表示为:

\'2\' \'0\' \'0\' \'1\'

| | | |

50 48 48 49

共占4字节。而在二进制流中则表示为:00000111 11010001 用十六进制就是07D1。只占两字节。

由此看出,二进制流比文本流节省空间,且不用进行对\\n的转换,这样可以大谈或大加快流的速度,提高效率。因而,对于含有大量数字信息的数字流,可以采用二进制流的方式;对于含有大量字符信息的流,则采用文本流的方式。

二、流和文件

在C语言中流就是一种文件形式,它实际上就表示一个文件或设备(从广义上讲,设备也是一种文件)。把流当作文件总觉得不习惯,因而有人称这种和流等同的文件为流式文件,流的输入输出也称为含镇伍文件的输入输出 *** 作。当流到磁盘而成为文件时,意味着要启动磁盘写入 *** 作,这样流入一个字符(文本流)或流入一个字节(二进制流)均要启动磁盘 *** 作,将大大降低传输效率(磁盘是慢速设备),且降低磁盘的使用寿命。为此,C语言在输入输出的使用使用了缓冲技术,即在内存为输入的磁盘文件开辟了一个缓冲区(缺省为512字节),当流到该缓冲区装满后,再启动磁盘一次,将缓冲区内容装到磁盘文件中去。读取文件也是类似。

在C语言中将此种文件输入输出 *** 作称为标准输入输出,或称流式输入输出(因这种输入输出 *** 作是ANSI C推荐的标准)。还有一种是不带缓冲文件输入输出,称为非标准文件输入输出或低级输入输出,它将由DOS直接管理。关于这两种输入输出文件系统下节将会介绍。

三、文件FILE的数据结构

typedef struct

{

short level

unsigned flags

char fd

unsigned char hold

short bsize

unsigned char *buffer

unsigned char *curp

unsigned istemp

short token

}FILE

这是Turbo C中使用的定义(在stdio.h文件中),不同的C编译器,可能使用不同的定义,但基本含义变化不会太大。

flags: 是一个10位的标志字,其具体含义如下:

位 代表符号 含义

0 _F_READ读

1 _F_WRIT写

2 _F_BUF 由fclose释放缓冲区

3 _F_LBUF行缓冲

4 _F_ERR 出错标志

5 _F_EOF EOF文件尾标志

6 _F_BIN 二进制方式

7 _F_IN 在进行输入

8 _F_OUT 在进行输出

9 _F_TERM文件是一个终端

其他各字段内容以及flags字段内各位所的功能,请参照其他一些资料。这里不多说了,它目前并不是我们要求的内容。

应该注意,不要把文件指针和FILE结构指针混为一谈,它们代表两个不同的地址。文件指针指出了对文件当前读写的数据位置,而FILE结构指针是指出了打开文件所对应的FILE结构在内存中的地址,这个指针它实际本身也包含了文件指针的信息。流指针中的各字段是供C语言内部使用的,用户不应该存取它的任何字段。

文本文吵枝件 和 二进制文件(不是包括流)的联系与区别:文本文件是直接在系统上显示为文本的文件,但在储存时,是以字节(二进制的8位)形式保存的。如升此敏果普通的二进制文件使用系统显示为文扒缓本文件,通常是看不懂的乱码文本,当中的原由是文本文件是按照编码规则编码的二进制文件,而没有编码的二进制文件显示文本文件肯定是乱码的。

以文件流的形式打开文件之后有多种方法可以读取文件,这里列举常用的几种:

(1) size_t fread ( void   *buffer,  size_t size,  size_t count,  FILE *stream) 

功 能:从一个文件流中读庆游哪数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0。

参 数:

buffer:用于接收数据的内存地址,大小至少是size*count字节.

size:单个元素的大磨配小,单位是字节

count:元素的个数,每个元素是size字节.

stream:输入流(即打开文件返回的句柄)

返回值:实际读取的元素个数.如果返回值与count不相同,则可能文件结尾或发生错误.

从ferror和feof获取错误信息或检测是否到达文件结尾.

(2) 誉码char *fgets(char *buf, int bufsize, FILE *stream)

功能: 从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

参数:

buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明buf指向的字符数组的大小。

stream: 文件结构体指针,将要读取的文件流(即打开文件返回的句柄)

(3) int fgetc(FILE *stream)

功能:意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。

参数:

stream:输入文件流(即打开文件返回的句柄)

返回值:是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。

对于文本文件要逐行处理的可以优先考虑fgets()

若要逐个字符处理的可以优先考虑fgetc()

若对二进制文件或者整块数据进行处理的优先考虑fread()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12203984.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存