Linux环境下C程序设计-第五章-标准IO库_第1页
Linux环境下C程序设计-第五章-标准IO库_第2页
Linux环境下C程序设计-第五章-标准IO库_第3页
Linux环境下C程序设计-第五章-标准IO库_第4页
Linux环境下C程序设计-第五章-标准IO库_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

11L/i2n67ux操作系统11:14第五章标准I/O库

本章首先介绍Linux下标准流I/O的相关内容;然后介绍标准I/O的操作,包括流的打开和关闭、缓冲区的操作、直接输入输出、格式化输入输出、基于字符和行的输入输出的操作;最后结合具体的示例,阐述标准I/O的相关操作在具体项目中的应用。本节学习目标:√流的打开和关闭√缓冲区的操作√直接输入输出√格式化输入输出√基于字符和行的输入输出22L/i2n67ux操作系统11:14内容提要第五章标准I/O库5.1标准流的I/O操作5.2流的打开和关闭5.3缓冲区的操作5.4直接输入输出5.5格式化输入输出5.6基于字符和行的输入输出33L/i2n67ux操作系统11:145.1标准流的I/O操作

Linux系统中基于流的I/O操作也是实现Linux底层文件输入输出操作的重要途径。在介绍基于流的I/O操作之前,先

介绍下“流”的概念,以便加深理解。在Linux系统中“流”被看作是文件和设备被打开后所形成的数据流。若要对流操作,需要借助文件指针FILE和标准输入输出库函数来实现。

本节介绍的基于流的I/O操作和上节中介绍的基于文件描述符的I/O操作相似,首先,通过调用库函数fopen()打开对应的流,fopen()会返回一个FIFL类型的指针;其次,流被打开后,通过使用打开流时返回的FILE指针,调用库函数,执行基于流的输入和输出操作;最后,当流操作完成后,通过调用库函数fclose()将流关闭。44L/i2n67ux操作系统11:145.2流的打开和关闭

本小节将介绍基于流I/O操作的关键一步:流的打开和关闭。在Linux系统编程中要对文件和设备进行打开和关闭操作,首先要打开这个文件和设备对应的流,其次借助打开流时返回的FIFL类型的指针进行操作对应的流,最后关闭流,释放相关资源。所以如何打开和关闭流,是基于流

I/O操作的关键一步。55L/i2n67ux操作系统11:141流的打开函数

打开一个流就是指建立该流和某个文件或设备间的关联关系,这样对该流的各种操作,就等同于对某个文件或设备的各种操作。

打开流的函数有三个,系统通过调用它们来完成对文件或设备的操作工作。在Linux系统终端中使用帮助命令“man

fopen”,得到函数的信息如下:#include

<stdio.h>FILE

*fopen(const

char

*path,

const

char

*mode);FILE

*fdopen(int

fd,

const

char

*mode);FILE

*freopen(const

char

*path,

const

char

*mode,

FILE

*stream);66L/i2n67ux操作系统11:141流的打开函数

fopen:该函数的返回类型为FILE类型的文件指针,用于打开一个特定的文件。path参数是一个字符型指针参数,表明所要打开的文件名。mode参数表示流的打开模式,比如r模式代表打开文本文件,只读不可写,从文件开头读;r+模式代表打开文本文件,可读可写,从文件开头读写;w模式代表打开文本文件,可写不可读,从文件开头写;w+模式代表打开文本文件,可读可写,从文件开头读写。mode参数含义,详情可以参考“man

fopen”命令,查看具体的说明信息。77L/i2n67ux操作系统11:141流的打开函数

fdopen:该函数的返回类型为FILE类型的文件指针,用于将某个打开的特定文件和某个流建立关联关系。fd参数是一个整型参数,表明所要打开文件的文件描述符。mode参数表示流的打开模式,和fopen函数中的mode参数

含义一样。88L/i2n67ux操作系统11:141流的打开函数

freopen:该函数的返回类型为FILE类型的文件指针,用于在特定的流上打开特定的文件。参数path和参数mode的含义,和fopen函数中的参数path和参数mode的含义一样。stream参数是一个FILE类型的指针,函数调用后,

先关闭stream所指向的流,然后用它重新指向path所代表的文件。此函数可以对标准数据流进行重新定向。

函数成功调用后返回指向所打开流的FILE结构指针,否则调用失败则返回

NULL。99L/i2n67ux操作系统11:142流的关闭函数

关闭一个流就是指关闭该流和某个文件或设备间的关联关系,这样就取消了该流和某个文件或设备的操作关系。

关闭流的函数是fclose,系统通过调用它来完成对文件或设备的取消关系。在Linux系统终端中使用帮助命令“man

fclose”,得到函数的信息如下:#include

<stdio.h>int

fclose(FILE

*fp);101L0i/n26u7x操作系统11:142流的关闭函数

该函数的返回类型为整型,用于关闭一个特定的文件。fp参数是FILE结构指针,表明所要关闭的文件流。如果程序结束后没有关闭流,会造成数据丢失。函数成功调用后返回0,否则调用失败则返回-1。111L1i/n26u7x操作系统11:145.3缓冲区的操作

本小节将介绍基于流I/O操作过程中不可或缺的一步:缓冲区的操作。在Linux系统编程中打开文件或设备对应的流后,需要借助打开流时返回的FIFL类型的指针进行缓冲区的操作。下面将介绍如何进行缓冲区的操作。121L2i/n26u7x操作系统11:141缓冲区属性的设置

缓冲区的属性包括缓冲区的类型和缓冲区的大小,所以缓冲区属性的设置包括其类型和大小的设置。一般情况下,调用库函数fopen打开一个流后,系统会开辟一个默认类型和默认大小的缓冲区,但在具体实际应用中,用户可以根据自身需要设置缓冲区的类型和大小。131L3i/n26u7x操作系统11:141缓冲区属性的设置

设置缓冲区属性的函数有多个,系统通过调用它们来完成对缓冲区属性的设置。在Linux系统终端中使用帮助命令

“man

setbuf”,得到函数的信息如下:#include

<stdio.h>void

setbuf(FILE

*stream,

char

*buf);void

setbuffer(FILE

*stream,

char

*buf,

size_t

size);void

setlinebuf(FILE

*stream);int

setvbuf(FILE

*stream,

char

*buf,

int

mode,

size_t

size);141L4i/n26u7x操作系统11:141缓冲区属性的设置

setbuf:该函数的返回类型为空,用于将缓冲区设置为全缓冲或无缓冲,可当作缓冲区的激活开关来使用。stream参数是FILE结构指针,指向所要设置的流。buf参数为指向缓冲的指针,当它为空时,系统设定为无缓冲区;当它非空时,系统设定为全缓冲区,其大小由预定义常数

BUFSIZ指定。151L5i/n26u7x操作系统11:141缓冲区属性的设置

setbuffer:该函数的返回类型为空,用于将缓冲区设置为全缓冲或无缓冲,使用方法与功能和setbuf函数类似,其区别是用户可以动态指定缓冲区的大小,满足自身需要。

size参数为用户设置缓冲区的大小。

setlinebuf:该函数的返回类型为空,用于将缓冲区设置为行缓冲区。stream参数是FILE结构指针,指向所要设置的流。161L6i/n26u7x操作系统11:141缓冲区属性的设置

setvbuf:该函数的返回类型为整型,功能最灵活,可以方便的设置缓冲区的各个属性,可以实现前面三个函数的所

有功能。stream参数是FILE结构指针,指向所要设置的流。

buf参数为指向缓冲的指针。mode参数为缓冲区的类型,

可为全缓冲类型_IOFBF、行缓冲区类型_IOLBT、无缓冲区类型_IONBF。size参数为用户设置缓冲区的大小。171L7i/n26u7x操作系统11:141缓冲区属性的设置

需要注意的是上述四个函数调用前,都必须先打开对应的流。上述四个函数中都有缓冲区buf,在Linux系统中提供了三种标准类型的缓冲区:全缓冲区、行缓冲区和无缓冲区。全缓冲区要求只有在填满整个缓冲区后才可以进行输入和输出的系统调用操作;行缓冲区是当输入或输出过程中遇到换行符时,或者当流在一个终端输入或输出时,或者每行的缓冲区填满时,都会使用行缓冲区;无缓冲区是用标准的输入或输出函数写若干字符到相关联的设备文件中。另外,由于流的各种操作和缓冲区的属性是密切关联的,所以先改变缓冲区的属性,然后对流进行各种操作。上述函数成功调用后返回0,否则调用失败则返回-1。181L8i/n26u7x操作系统11:142缓冲区的保存

缓冲区的保存是指将缓冲区中的内容保存到文件中或者将其清除掉。

缓冲区的保存函数是fflush,系统通过调用它完成对缓冲区中内容的保存工作。在Linux系统终端中使用帮助命令

“man

fflush”和“man

fpurge”,得到函数信息如下:#include

<stdio.h>int

fpurge(FILE

*stream);int

fflush(FILE

*stream);191L9i/n26u7x操作系统11:142缓冲区的保存

fpurge:该函数的返回类型为整型,用于将缓冲区的内容完全清楚。stream参数是FILE结构指针,表明所要操作的文件流。

fflush:该函数的返回类型为整型,用于将缓冲区的内容强制保存到文件中。stream参数是FILE结构指针,表明所要操作的文件流。函数成功调用后返回0,否则调用失败则返回EOF。202L0i/n26u7x操作系统11:145.4直接输入输出

本小节将介绍基于流I/O操作的直接输入输出操作。在Linux系统编程中,直接输入输出操作是以记录为单位进行读写的操作。下面将介绍如何进行直接输入输出操作。212L1i/n26u7x操作系统11:141直接输入输出函数

直接输入输出操作的函数是fread和fwrite,系统通过调用它来完成对缓冲区中内容的保存工作。在Linux系统终端

中使用帮助命令“man

fread”,得到函数的信息如下:#include

<stdio.h>size_t

fread(void

*ptr,

size_t

size,

size_t

nmemb,

FILE*stream);

size_t

fwrite(const

void

*ptr,

size_t

size,

size_tnmemb,FILE

*stream);222L2i/n26u7x操作系统11:141直接输入输出函数

fread:该函数的返回类型为整型,用于直接执行输出操作。ptr参数是指向缓冲区的指针,缓冲区存放从文件流读取的数据。size参数是整型类型,存放所要读取记录的大小。nmemb参数是整型类型,存放所要读取记录的个数。

stream参数是FILE结构指针,表明所要读取的文件流。

fread函数调用成功后返回实际读取的记录数目,否则调

用失败返回0。232L3i/n26u7x操作系统11:141直接输入输出函数

fwrite:该函数的返回类型为整型,用于直接执行输入操作。ptr参数是指向缓冲区的指针,缓冲区存放要写入文件流的数据。size参数是整型类型,存放所要写入记录的大小。nmemb参数是整型类型,存放所要写入记录的个数。

stream参数是FILE结构指针,表明所要写入的文件流。

fwrite函数调用成功后返回实际写入的记录数目,否则调用失败返回0。242L4i/n26u7x操作系统11:141直接输入输出函数

fread函数和fwrite函数调用失败后,系统的文件错误标志和结束标志会被置为相应的标志位值,经库函数feof和ferror检测这些标志位值,可发现这些错误,便于系统修复。在Linux系统终端中使用帮助命令“man

fread”,得到函数的信息如下:检测文件错误标志和文件结束标志的库函数feof和ferror,252L5i/n26u7x操作系统11:141直接输入输出函数

fread函数和fwrite函数调用失败后,系统的文件错误标志和结束标志会被置为相应的标志位值,经库函数feof和ferror检测这些标志位值,可发现这些错误,便于系统修复。在Linux系统终端中使用帮助命令“man

fread”,得到函数的信息如下:检测文件错误标志和文件结束标志的库函数feof和ferror,#include

<stdio.h>void

clearerr(FILE

*stream);int

feof(FILE

*stream);int

ferror(FILE

*stream);int

fileno(FILE

*stream);262L6i/n26u7x操作系统11:141直接输入输出函数

clearerr:该函数的返回类型为空,用于对文件错误标志和结束标志位清零。stream参数是FILE结构指针,表明所要操作的文件流。

feof:该函数的返回类型为整型,用于检测是否读取到文件的末尾。stream参数是FILE结构指针,表明所要读取的文件流。若访问到文件末尾,则返回值为1;否则返回值为0。272L7i/n26u7x操作系统11:141直接输入输出函数

ferror:该函数的返回类型为整型,用于检测是否出现了读写错误。stream参数是FILE结构指针,表明所要读写的文件流。若访问正常结束,则返回值为0;否则返回值为非0。

fileno:该函数的返回类型为整型,用于检测参数stream是否有效。stream参数是FILE结构指针,表明所要操作的文件流。若检测参数stream有效,则返回值为它的文件描述符;否则返回值为-1。282L8i/n26u7x操作系统11:142综合示例

在本节最后,通过利用直接输入输出函数进行系统调用,来演示直接输入输出读写操作文件,加强对基于文件流的I/O操作的理解。如范例5-1所示。例5-1

my_fread_fwrite.c/****my_fread_fwrite.c***/在VIM编辑器中具体阐述代码在eclipse集成开发环境IDE中编译、调试、运行代码292L9i/n26u7x操作系统11:14303L0i/n26u7x操作系统11:145.5格式化输入输出

本小节将介绍基于流I/O操作的格式化输入输出操作。在

Linux系统编程中,格式化输入输出操作便于数据规范化和标准化。下面将介绍如何进行格式化的输入输出操作。313L1i/n26u7x操作系统11:141格式化输入函数

格式化输入是指将数据标准化和规范化后输入到指定的内存中。

格式化输入函数有三个,系统通过调用它们来完成数据的格式化输入工作。在Linux系统终端中使用帮助命令

“man

scanf”,得到函数的信息如下:#include

<stdio.h>int

scanf(const

char

*format,

...);int

fscanf(FILE

*stream,

const

char

*format,

...);int

sscanf(const

char

*str,

const

char

*format,

...);323L2i/n26u7x操作系统11:141格式化输入函数

scanf:该函数的返回类型为整型,用于从标准输入流中输入数据。format参数是字符串指针,表明所要描述的输入格式。

fscanf:该函数的返回类型为整型,用于从指定的流中输入数据。stream参数是FILE结构指针,表明所要输入的文件流。format参数的含义同scanf函数中的一样。

sscanf:该函数的返回类型为整型,用于从指定的字符串中输入数据。str参数是字符串指针,表明所要输入的缓冲区。format参数的含义同scanf函数中的一样。

函数成功调用后返回实际输入的字符数,否则调用失败则返回EOF。333L3i/n26u7x操作系统11:142格式化输出函数

格式化输出是指将数据标准化和规范化后输出到指定的内存中。

格式化输出函数有四个,系统通过调用它们来完成数据的格式化输出工作。在Linux系统终端中使用帮助命令

“man

3

printf”,得到函数的信息如下:#include

<stdio.h>int

printf(const

char

*format,

...);int

fprintf(FILE

*stream,

const

char

*format,

...);int

sprintf(char

*str,

const

char

*format,

...);int

snprintf(char

*str,

size_t

size,

const

char

*format,

...);343L4i/n26u7x操作系统11:142格式化输出函数

printf:该函数的返回类型为整型,用于向标准输出流中输出数据。format参数是字符串指针,表明所要描述的输出

格式。

fprintf:该函数的返回类型为整型,用于向指定的流中输出数据。stream参数是FILE结构指针,表明所要输出的文件流。format参数的含义同printf函数中的一样。

sprintf:该函数的返回类型为整型,用于向指定的字符串中输出数据。str参数是字符串指针,表明所要输出的缓冲区。format参数的含义同printf函数中的一样。353L5i/n26u7x操作系统11:142格式化输出函数

snprintf:该函数的返回类型为整型,用于向指定的字符串中输出数据。str参数和format参数的含义同sprintf函数中的一样。size参数是要设置的缓冲区的大小。snprintf可以对缓冲区进行处理,而sprintf函数不能。

函数成功调用后返回输出的字节数,否则调用失败则返回负数。363L6i/n26u7x操作系统11:143综合示例

在本节最后,通过利用格式化输入输出函数进行系统调用,来演示格式化输入输出读写操作文件,加强对基于文件流的I/O操作的理解。如范例5-2所示。例5-2

my_

fscanf_fprintf.c/****my_fscanf_fprintf.c***/在VIM编辑器中具体阐述代码在eclipse集成开发环境IDE中编译、调试、运行代码373L7i/n26u7x操作系统11:145.6基于字符和行的输入输出

本小节将介绍基于字符和行的输入输出操作。在Linux系统编程中,字符和行输入输出操作应用便利和广泛。下面将介绍如何进行基于字符和行的输入输出操作。383L8i/n26u7x操作系统11:141字符的输入输出函数

字符的输入输出函数有多个,系统通过调用它们来完成字符的输入输出工作。在Linux系统终端中使用帮助命令

“man

getc”和“man

putc”,得到函数的信息如下:#include

<stdio.h>int

fgetc(FILE

*stream);int

getc(FILE

*stream);int

getchar(void);int

ungetc(int

c,

FILE

*stream);int

fputc(int

c,

FILE

*stream);int

putc(int

c,

FILE

*stream);int

putchar(int

c);393L9i/n26u7x操作系统11:141字符的输入输出函数

fgetc,getc:这两函数的返回类型为整型,用于向stream指定的流中读入数据,执行字符的输入操作。stream参数是FILE结构指针,表明所要读入的流。其区别是getc函数可当作宏来使用,而fgetc只能作为函数使用。

getchar:该函数的功能和fgetc,getc函数类似,其区别是getchar函数只能用来从标准输入流中输入数据,相当于getc函数以stdin为参数进行调用时的功能。

ungetc:该函数的返回类型为整型,用于将读入的字符推回流中。c参数表示要推回的字符。stream参数是FILE结构指针,表明所要操作的流。404L0i/n26u7x操作系统11:141字符的输入输出函数

fputc,putc,putchar:执行字符输出操作的函数fputc,putc,putchar之间的关系同执行字符输入操作的函数

fgetc,getc,getchar类似。putc函数作为宏来使用,

fputc只能作为函数来使用。putchar函数只能用来向标准输出流中输出数据,相当于putc函数以stdout为参数进行调用时的功能。

fgetc,getc,getchar函数成功调用后返回输入的字节数,否则调用失败则返回EOF。

ungetc函数成功调用后返推入的字节数,否则调用失败则返回EOF。

fputc,putc,putchar函数成功调用后返回输出的字节数,否则调用失败则返回EOF。414L1i/n26u7x操作系统11:142行的输入输出函数

行的输入输出函数有多个,系统通过调用它们来完成行的输入输出工作。在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论