收藏 分享(赏)

零点起飞学Linux C之标准输入输出.pptx

上传人:ysd1539 文档编号:12437257 上传时间:2021-12-12 格式:PPTX 页数:28 大小:310.98KB
下载 相关 举报
零点起飞学Linux C之标准输入输出.pptx_第1页
第1页 / 共28页
零点起飞学Linux C之标准输入输出.pptx_第2页
第2页 / 共28页
零点起飞学Linux C之标准输入输出.pptx_第3页
第3页 / 共28页
零点起飞学Linux C之标准输入输出.pptx_第4页
第4页 / 共28页
零点起飞学Linux C之标准输入输出.pptx_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、第9章标准输入输出 输入输出是指基于标准输入输出库实现的系统调用 由于用户经常需要进行这方面开发 系统提供了丰富的函数 并封装成库 使用该库 可以解决大部分输入输出问题 本章将详细讲解标准输入输出的基本操作 非格式化输入输出和格式化输入输出 9 1标准输入输出的基本操作 与上一章中介绍的输入输出函数不同 标准输入输出操作是通过文件控制结构FILE进行的 文件控制结构中包含处理文件所需的全部信息 例如文件名 文件当前的读写位置 用于该文件读写的内存缓冲区位置等 打开文件时 系统会在内存中自动建立该文件的控制结构 关闭文件时 文件控制结构被释放 在对文件进行操作之前 要首先获取文件的指针 即指向文

2、件控制结构的指针 后续操作都通过该指针进行 9 1 1打开文件 操作文件之前要打开文件 打开文件的函数为fopen 其一般形式为 FILE fopen constchar filename constchar modes 其中 filename表示要打开的文件名 可以是文件名字符串的首地址 也可以是双引号引起来的文件名字符串 modes表示打开方式 取值如表所示 9 1 1打开文件 如果文件成功打开 则fopen函数返回一个文件指针 如果文件不存在或由于其他原因而没有成功打开 则返回NULL 并将错误码存在errno之中 errno是一个整型变量 后面将会详细介绍 例如打开当前目录下的hell

3、o c文件 FILE fp fp fopen hello c r 上面的代码中首先定义了一个文件指针 然后以只读方式打开文件 如果文件打开成功 文件的指针存在变量fp之中 9 1 2关闭文件 对文件操作完成后 应该关闭文件 这样可以释放所占用的资源 关闭文件的函数为fclose 其一般形式为 intfclose FILE fp 其中 参数fp为要关闭文件的指针 如果文件成功关闭 则fclose函数返回0 在该函数返回前 系统会将缓冲区内的数据全部写入文件中 如果文件关闭时出错 如传给它的为一个无效文件指针 则返回EOF 并将错误码存在errno之中 EOF的定义在头文件stdio h之中 如下

4、所示 132 Endoffilecharacter 133Somethingsthroughoutthelibraryrelyonthisbeing 1 134 ifndefEOF135 defineEOF 1 136 endif注意 132表示该代码在stdio h中的位置 可以看到 EOF的值为 1 实例9 1 下面编写一个程序 来说明文件打开与关闭函数的使用方法 example1 c 9 1 3清空缓冲区 刷新缓冲区用于将缓冲区中的数据清除 Linux提供fflush和fpurge来完成该工作 他们的一般形式为 intfflush FILE fp intfpurge FILE fp ff

5、lush函数将缓冲区中的数据写入到磁盘文件或输出到用户终端 同时清空缓冲区 fpurge函数将缓冲区中的数据直接清除 包括尚未读取或写入的数据 9 1 4设置缓冲区属性 根据缓冲区操作时机 缓冲区的类型有下面三种 全缓冲 缓冲区被填满后才执行输入输出操作 将数据写入到磁盘文件或输出到用户终端 行缓冲 缓冲区中填入换行符时 执行输入输出操作 无缓冲 不对数据进行缓存 标准错误输出stderr一般就是无缓冲的 这可以使错误信息尽快地显示出来 缓冲区的大小和类型等都可以通过函数来设置 打开文件后 用户可以使用下面的函数来设置自己的文件缓冲区 而不使用fopen函数打开文件设定的默认缓冲区 9 1 4

6、设置缓冲区属性 intsetvbuf FILE fp char buf intmode size tsize 其中 参数fp指向已经打开的文件 buf为用户设定的缓冲区 mode为缓冲区的类型 可以取为 IOFBF IOLBF或 IONBF 分别表示全缓冲 行缓冲或无缓冲 size为缓冲区的大小 除setvbuf函数外 还有如下三个函数 intsetbuf FILE fp char buf intsetbuffer FILE fp char buf size tsize intsetlinebuf FILE fp setbuf函数中 如果buf设为NULL 缓冲区将被设为无缓冲 否则设置全缓冲

7、 缓冲区的大小由头文件stdio h中的常量BUFSIZE决定 默认情况下为512字节 该函数等价于 setvbuf FILE fp char buf buf IOFBF IONBF BUFSIZE setbuffer函数中 如果buf设为NULL 缓冲区将被设为无缓冲 否则设置全缓冲 缓冲区的大小由参数size决定 该函数等价于 setvbuf FILE fp char buf buf IOFBF IONBF size tsize setlinebuf函数将缓冲区设为行缓冲 它等价于 setvbuf FILE fp NULL IOLBF 0 9 2非格式化输入输出 非格式化输入输出是指输入或

8、者输出的时候 不指定数据的格式 只是单纯的读取或者写入数据 根据读取数据的多少 可以分为单字节 字符串 数据块三种类型 下面分别介绍这三种类型的输入输出 9 2 1单字节输入输出 单字节输入输出是指从缓冲区读取或者写入一个字符 Linux提供了fgetc和fputc函数来完成这项工作 下面依次进行讲解 1 单字节读取fgetc函数 从文件中读取单个字节可以使用fgetc函数 它的一般形式为 intfgetc FILE fp 该函数的功能是从指定的文件中读一个字节 如果操作成功 函数返回读到字节 如果出错或读到文件末尾时则返回EOF 文件的控制结构中记录着当前的读写位置 也称为偏移量 Offse

9、t 即读写位置距离文件开头的字节数 当文件打开时 读写位置为0 每调用一次fgetc函数 读写位置向后移动一个字节 因此可以连续多次调用fgetc函数来依次读取多个字节 注意 函数原型中的返回值为int型 即将字节转换为整型之后返回的 这主要是为了区分EOF和0 xff字节 如果需要保存fgetc的返回值 一定要保存在int型变量中 除了上面介绍fgetc函数外 还有一个getchar函数 它是从标准输入读一个字节 一般形式为 intgetchar 该函数等价于 intfgetc stdin 2 单字节写入fputc函数 向指定的文件写一个字节可以使用fputc函数 它的一般形式为 intfp

10、utc intc FILE fp 使用该函数时 文件的打开方式必须是可写或可追加的 每调用一次fputc函数 读写位置向后移动一个字节 因此可以连续多次调用fputc函数来依次写入多个字节 如果文件是以追加方式打开的 每次调用fputc函数总是将读写位置移到文件末尾 然后将要写入的字节追加到后面 同样 函数putchar可以向标准输出写一个字节 一般形式为 intputchar intc 该函数等价于 intfputc c stdout 2 单字节写入fputc函数 实例9 2 下面编写一个程序 从键盘读入一串字符写到一个文件之中 然后再从文件读出这些字符输出到屏幕上 example2 c 此

11、时 可以查看文件test的内容 cat test在上面的程序中 我们使用了rewind函数 它的作用是将文件的读写位置移至文件的开头 其一般形式为 voidrewind FILE fp 除了rewind函数外 还有两个函数可以操作文件的读写位置 它们是fseek函数和ftell函数 fseek函数的原型为 intfseek FILE fp longoffset intwhence 该函数的功能是移动文件的读写位置 其中参数fp为已打开的文件指针 参数offset为移动的字节数 参数whence的值可以为0 1或2 分别表示从文件开头移动 从当前位置移动 或从文件末尾移动 这些值也可以使用SEE

12、K SET SEEK CUR 以及SEEK END来表示 例如将读写位置移动到文件的开头 fseek fp 0 SEEK SET 将读写位置移动到文件的末尾 fseek fp 0 SEEK END fseek函数调用成功时 返回值为0 如果出错则返回EOF 并将错误码存在errno之中 ftell函数可以返回当前的读写位置 一般形式为 longftell FILE fp 如果函数调用成功 则返回当前读写位置 出错则返回EOF 并将错误码存在errno之中 2 单字节写入fputc函数 实例9 3 下面编写一个程序 读取文件开头的第1 3 5 7字节并输出到屏幕 example3 c 9 2 2

13、字符串输入输出 字符串输入输出是指从缓冲区读取或者写入多个字符 Linux提供了fgets和fputs函数来完成这项工作 下面依次进行讲解 1 字符串读取fgets函数 fgets函数可以从指定的文件中读一行字符到缓冲区中 一般形式为 char fgets char s intn FILE fp 其中 参数s为缓冲区的首地址 n为读取字符的个数 该函数从文件中读取字符时 达到以下任何一个条件时 函数将返回 已经读取到了n 1个字符 读取到回车符 读到了文件末尾 其中读取到回车符时 该字符也会被送入参数s指向的缓冲区之中 读取结束后 fgets函数会再向缓冲区送入一个NULL字符 以作为字符串结

14、尾 从上面的可以看到 虽然参数n指定了读取字符的个数 但实际读到得字符串长度往往比指定的长度要短 这主要是由于读到回车符就结束的缘故 对于fgets函数来说 回车符是一个特殊字符 但NULL属于普通字符 也就是说 如果在文件中存在NULL字符 调用该函数之后会作为普通字符读入 这样 缓冲区中的NULL字符无法判断是从文件中读取的字符还是自动添加的结束符 所以该函数只适合读取文本文件 并且文本文件中的所有字符都应该是可见字符 实例9 4 下面编写一个程序 显示文件内容并同时输出行号 example4 c 2 字符串写入fputs函数 fputs函数可以向指定的文件写入一个字符串 一般形式为 in

15、tfputs constchar s FILE fp 其中 参数s为指向字符数组的指针 或为字符串常量 将字符串写入到文件时 并不写入字符串结尾的NULL字符 与前面的fgets函数不同 fputs函数不关心字符串中是否存在回车符 实例9 5 下面使用fgets函数和fputs函数来逐行复制一个文本文件 example5 c 上面的程序中 使用了feof函数来测试读写位置是否到达文件末尾 该函数的一般形式为 intfeof FILE fp 如果读写位置已经到达文件末尾 则返回1 否则返回0 该函数在处理二进制文件时特别有用 因为在二进制文件中EOF为一个合法的数据 9 2 3数据块输入输出 数

16、据块 是指一串固定长度的字节 例如一个整型数据 一个结构体 或一个固定长度的数组等 对文件进行输入输出操作 也可以以数据块为单位进行 从文件中读取数据块可以使用fread函数 它的一般形式为 size tfread void ptr size tsize size tn FILE fp 其中 参数ptr为缓冲区的首地址 size为要读取的数据项的长度 n为要读取的数据项的个数 fp为已经打开的文件的指针 fread函数的功能就是从文件fp中读取size n个字节 并保存到缓冲区ptr之中 该函数的返回值为实际读取的数据项个数 由于读取过程中可能会出错或文件结束 实际读取的数据项个数小于等于参数

17、n 注意 如果fp指向的文件以文本方式打开的 则该函数会将回车换 行符转换为换行符 而如果是以二进制方式打开的 则不进行任何转换 向文件中写入数据块可以使用fwrite函数 它的一般形式为 size tfwrite void ptr size tsize size tn FILE fp 该函数将ptr指向的缓冲区中的数据写入到由fp指向的文件中 写入的长度由size和n决定 函数的返回值为实际写入的数据项个数 如果写入过程中出错 返回值小于n 9 2 3数据块输入输出 实例9 6 下面的例子由两个程序组成 一个程序将数据保存到文件之中 另一个程序和从文件中读取数据 example6 c 这样

18、三个学生的学号和成绩就被保存到了文件之中 实例9 7 下面编写程序 从文件中读取数据并输出到屏幕 example7 c 可以看到 三个学生的学号和成绩被从文件中读出并输出到了屏幕上 9 3格式化输入输出 格式化输入输出就是将输入或者输出的字符按照规定的格式进行格式化后再进行输入或者输出 格式化输出可以使用函数fprintf和printf fprintf函数的一般形式为 intfprintf FILE fp constchar format 其中参数fp为输出文件的指针 format为输出的格式 后面跟输出项 该函数的功能是按照指定的格式向文件fp中输出信息 printf函数的一般形式为 int

19、printf constchar format 该函数等价于 intfprintf stdout constchar format 下面对函数中的输出格式进行详细介绍 如下所示 0 m n l 转换字符输出格式以 号开头 以转换字符结尾 前面使用时都是 号后直接加转换字符 例如 d s等 其实在这两个字符之间还可以插入一些可选项 1 转换字符 转换字符用来指定输出项的输出形式 如表所示 2 指定输出精度 在字母d u e f以及g等的前面加字母l 例如 ld le 表示输出长整型 long 或双精度浮点型 double 3 指定输出长度 通过m n的形式可以指定输出数据的长度 其中字母m为输出

20、数据的总字符长度 n为输出数据小数部分的字符长度 实例9 8 输出一个浮点数 要求整个数据占6个字符位置 其中小数部分占4个字符位置 doublex 0 123 printf 6 4f n x 输出结果为 0 1230 实例9 9 输出一个整数 要求整个数据占8个字符位置 intx 1234 printf 8d n x 输出结果为 1234说明 输出结果前面有4个空格 输出字符串时 也可以使用m n来指定输出长度 这时字母m为字符串占用的总字符长度 n为实际输出的字符个数 实例9 10 输出一个字符串的前3个字符 但整个字符串占5个字符位置 charch ABCD printf 5 3s n

21、ch 输出结果为 ABC说明 输出结果前面有2个空格 4 空位填零 这一项只在输出数值时有效 当指定时 不使用的输出位置自动填0 不指定时 这些位置空白 因为前面我们都没有指定 所以输出结果前面有空格 实例9 11 输出一个整数 在空位处填零 intx 123 printf 06d n x 输出结果为 000123 5 指定输出位置 这一项设置输出结果的对齐方式 默认 为右对齐 如果指定为减号时 左对齐 实例9 12 使用左对齐和右对齐两种方式输出一个字符串 charch ABCD printf 5 3s n ch printf 5 3s n ch 输出结果为 ABCABC格式化输入的函数为s

22、canf 其一般形式为 intfscanf FILE fp constchar format 该函数的功能是从指定的文件读字符 按照指定的格式转换并赋给后面的参数 后面的参数一般为地址 前面使用的scanf函数的一般形式为 intscanf constchar format 该函数等价于 intfscanf stdin constchar format 该函数用读入的字符去匹配格式说明中的转换字符 如果成功匹配 就给后面的参数赋值 否则就返回 例如转换字符是 d 但读到的却是C 如果遇到不匹配的地方而停止 函数的返回值会小于赋值参数的个数 5 指定输出位置 关于输入格式下面给出几点说明 1 格

23、式说明中的空白字符会使scanf函数在读操作时略去输入中的一个或多个空白字符 如下所示 intx y scanf d d 只能输入10个字符给字符数组str 程序运行时 一旦输入字符个数大于10时 scanf函数就停止读入 4 格式化输入时没有精度控制 5 指定输出位置 实例9 13 下面编写一个程序 对输入的整数进行累加 example13 c 上面列出的四个格式化输入输出函数有对应的可变参数函数 即参数不是以 的形式传进入 而是通过va list类型传递 函数的一般形式为 intvfprintf FILE fp constchar format va listap intvprintf c

24、onstchar format va listap intvfscanf FILE fp constchar format va listap intvscanf constchar format va listap va list是C语言中为了处理可变参数的函数而定义的宏 相关的还有va start va arg以及va end宏 实例9 14 下面编写一个可变参数的函数 实现一个或多个整数的求和运算 example14 c 在上面的程序中 sum为可变参数函数 它的参数可以分为两部分 个数确定的固定参数和个数可变的可选参数 他们共同构成了函数的参数列表 固定参数的声明和普通函数一样 函数必

25、须至少有一个固定参数 可选参数由于个数不确定 声明时可以使用 来表示 程序中定义了一个va list类型的变量 它是指向参数列表的指针 宏va start使参数列表指针指向参数列表中的第一个可选参数 它本身有两个参数 指向参数列表的指针和最后一个固定参数 宏va arg返回参数列表中指针所指向的参数 并将指针指向参数列表中下一个参数 它本身也有两个参数 指向参数列表的指针和参数的类型 宏va end清空参数列表 使参数列表指针无效 函数要有一个参数作为标志来表示结束 否则会出错 在上例中使用固定参数sum来进行判断 当然也可以使用其他方式来进行 例如字符串处理中使用NULL等 实例9 15 下面使用vprintf函数来实现一个我们自己的printf函数 example15 c 可以看到 x y和z按照指定的格式被输出到了屏幕上 9 4小结 本章主要介绍了标准输入输出 非格式化输入输出 和格式化输入输出相关处理技术的使用 计算机在使用过程中时刻在输入与输出 输入与输出是计算机与操作者中间建立的沟通桥梁 因此 掌握这些知识是非常有必要的 下一章我们将要讲解的是进程操作的相关知识

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报