Linux环境编程课件Linux环境编程6章节

上传人:E**** 文档编号:91250388 上传时间:2019-06-26 格式:PPT 页数:40 大小:201KB
返回 下载 相关 举报
Linux环境编程课件Linux环境编程6章节_第1页
第1页 / 共40页
Linux环境编程课件Linux环境编程6章节_第2页
第2页 / 共40页
Linux环境编程课件Linux环境编程6章节_第3页
第3页 / 共40页
Linux环境编程课件Linux环境编程6章节_第4页
第4页 / 共40页
Linux环境编程课件Linux环境编程6章节_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《Linux环境编程课件Linux环境编程6章节》由会员分享,可在线阅读,更多相关《Linux环境编程课件Linux环境编程6章节(40页珍藏版)》请在金锄头文库上搜索。

1、1,第6章,标准I/O库,2,6.1 流和文件指针,流(stream)。 在Linux系统中,文件和设备都可被看作是数据流。 数据流指的是无结构的字节序列。 当用标准I/O库打开或创建一个文件时,即将一个流与一个文件结合起来。 标准I/O库使用一个文件指针(类型为FILE*)来表示流。 FILE结构包含了I/O库为管理该流所需要的所有信息 用于实际I/O的文件描述符 指向流缓存的指针 缓存的长度 当前在缓存中的字符数 出错标志,等等。 在头文件中预定义的三个标准I/O流 stdin 标准输入流 STDIN_FILENO stdout 标准输出流 STDOUT_FILENO stderr 标准错

2、误输出流 STDERR_FILENO,3,目的是尽可能减少使用read和write调用的次数 三种类型 全缓存 当标准I/O缓存填满后才进行实际I/O操作; 在一个流上执行第一次I/O操作时,相关标准I/O函数调用malloc函数分配所需使用的缓存。 刷新(flush):自动刷新或调用fflush()刷新。 行缓存 在输入和输出中遇到换行符时执行实际I/O操作; 当流涉及一个终端时,典型地使用行缓存。 两个限制 行的缓存的长度是固定的,填满就会进行I/O操作; 当要求从一个不带缓存的流或一个行缓存的流得到输入数据时,会造成刷新所有行缓存输出流。 不带缓存 相当于用write系统调用; 标准错误

3、输出流stderr通常是不带缓存的,这就使得出错信息可以尽快显示出来。,6.2 缓存,ANSI C规定: 1, 当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。 2, 标准错误输出绝对不会是全缓存的。,4,打开流 使用fopen系列函数可以创建或打开流文件.,path 要打开或创建的文件的名称. mode 对该I/O流的读、写方式,ANSI C规定了15种不同的可能值. r或rb 以读方式打开 w或wb 以写方式打开或创建,并将文件长度截为0 a或ab 以写方式打开,新内容追加在文件尾 r+或r+b或rb+ 以更新方式打开(读和写) w+或w+b或wb+ 以更新方式打开,并

4、将文件长度截为0 a+或a+b或ab+ 以更新方式打开,新内容追加在文件尾,#include 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);,6.3 流的打开和关闭,5,打开流 使用fopen系列函数可以创建或打开流文件.,fd 待关联的底层文件描述符. stream 待关联的流文件指针,若该流已打开则会被先关闭. 返回值 成功时返回流文

5、件指针; 失败时返回NULL 说明 freopen在由stream指定的流上打开一个指定的文件,如若该流已经打开,则先关闭该流。 fdopen取一个现存的文件描述符(可通过底层系统调用open、dup、dup2、fcntl或pipe等函数得到),并使一个标准的I/O流与该描述符相结合。 fdopen以写方式打开并不会创建该文件或截短该文件。,#include FILE *fopen(const char *path, const char *mode); FILE *fdopen(int fd, const char *mode); FILE *freopen(const char *path

6、, const char *mode, FILE *stream);,6.3 流的打开和关闭,6,打开流,说明 能否成功打开文件流受打开方式的限制; 进程可打开的文件流的数量有一个上限FOPEN_MAX; 创建文件时,许可权为: S_IRUSRS_IWUSRS_IRGRPS_IWGRPS_IROTHS_IWOTH,6.3 流的打开和关闭,7,关闭流 在使用完流文件后,应调用fclose函数关闭流。,#include int fclose(FILE *fp);,fp 待关闭的文件流。 返回值 成功时函数返回0,失败返回EOF(-1)。 说明 在文件流被关闭之前,fclose会刷新缓存中的输出数据

7、,但缓存中的输入数据被丢弃。 如果标准I/O库已经为该流自动分配了一个缓存,则释放此缓存。 进程正常终止时,所有带未写缓存数据的流都被刷新,所有打开的标准I/O流都被关闭。 用法,6.3 流的打开和关闭,FILE *fp = NULL; /* 定义文件指针 */ fp = fopen(“filename“, “r“) /* 打开文件 */ if(fp = NULL) /* 判断是否成功打开 */ printf(“Cannot open file.n“); exit(-1); /* 打开失败则退出 */ /* 读写文件 */ fclose(fp); /* 关闭文件 */,8,非格式化I/O 每次

8、一个字符的I/O。 每次一行的I/O。以换行符标示一行的终止。 二进制I/O。 格式化I/O 从输入流读取字符串并以指定的格式转换成内存中的二进制数据 将内存中的二进制数据以指定的格式转换成字符串并将转换后的字符串写入输出流。,6.4 基于字符和行的I/O,9,读字符 一次读取一个字符,#include int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void);,6.4.1 字符I/O,stream 已打开并准备从其中读取数据的流 返回值 返回所读取到的字符,出错或已到达文件尾端时返 回EOF。 注: getchar等

9、同于getc(stdin)。 getc可被实现为宏,而fgetc则一定是一个函数,两者功能一样。 每一次成功的调用会使当前读写位置向文件尾部移动一个字符。 函数以unsigned char类型转换为int的方式返回下一个字符。 回送字符 用于需要根据下一个字符的值来决定如何处理当前字符的情况。 送回到流中的字符以后又可从流中读出,但读出字符的顺序与送回的顺序相反。 回送的字符,不一定必须是上一次读到的字符,但是不能回送EOF。,#include int ungetc(int c, FILE *stream);,10,判断流结束或出错 FILE对象中为每个流保持了两个标志:文件结束标志和出错标志

10、。 feof和ferror函数分别判断流是否结束或流是否出错。,#include int feof(FILE *stream); int ferror(FILE *stream);,6.4.1 字符I/O,stream 已打开的流 返回值 流已到文件尾时,feof返回非0,否则返回0。当流 出错时,ferror返回非0,否则返回0。 clearerr函数可以清除FILE对象中的文件结束标志和出错标志。,#include void clearerr(FILE *stream);,11,写字符 一次写入一个字符,#include int fputc(int c, FILE *stream); in

11、t putc(int c, FILE *stream); int putchar(int c);,6.4.1 字符I/O,stream 已打开并准备向其中写入数据的流 返回值 返回所写入的字符,出错时返回EOF。 注: putchar(c)等同于putc(c,stdout)。 putc可被实现为宏,而fputc则一定是函数,两者功能一样。 每一次成功的调用会使当前读写位置向文件尾部移动一个字符。 示例,12,写字符,6.4.1 字符I/O,程序清单 6-1 ex_io_char.c 1 #include 2 #include 3 4 int main( ) 5 6 FILE *fp; 7 in

12、t c; 8 char* filename = “1.txt“; 9 10 if(fp = fopen(filename,“w“) = NULL) 11 12 printf(“Cant open %s for writing.n“, filename); 13 exit(-1); 14 15 while (c = getchar() != EOF) /* 按Ctrl-D键产生EOF值 */ 16 fputc(c, fp); 17 fclose(fp); 18,13,19 printf(“Output file content:n“); 20 if(fp = fopen(filename,“r“

13、) = NULL) 21 22 printf(“Cant open %sn for reading.“, filename); 23 exit(-1); 24 25 while (c = fgetc(fp) != EOF) 26 putchar(c); 27 fclose(fp); 28 29 return 0; 30 ,6.4.1 字符I/O,写字符,jianglinmeiubuntu:/c$ gcc -o ex_io_char ex_io_char.c jianglinmeiubuntu:/c$ ./ex_io_char This is an example for character I

14、/O Good, over! 注:在此回车后按下Ctrl+D终止输入 Output file content: This is an example for character I/O Good, over! jianglinmeiubuntu:/c$ ls 1.txt 1.txt,14,读行 一次读取一行文本,#include char *fgets(char *s, int size, FILE *stream); char *gets(char *s);,6.4.2 行I/O,s 输入缓存。 size 输入缓存大小。 stream 流文件指针。 返回值 成功时返回指向缓存的指针,失败或处

15、于文件尾端 时返回NULL,同时设置errno。 注: fgets从指定的流读,而gets从标准输入(即stdin)读。 每成功调用一次会使当前读写位置向文件尾部移动所读取到的字符数。 fgets一直读到下一个换行符(n)为止(换行符会放入s),但是不超过n-1个字符,且s总是以null字符结尾。 gets是一个不推荐使用的函数,因可能越界。 fgets会将读取到的换行符送入缓存,而gets并不保存换行符。,15,写行 一次写入一行文本,#include int fputs(const char *s, FILE *stream); int puts(const char *s);,6.4.2

16、 行I/O,s 待输出的字符串,应以null终止。 stream 流文件指针。 返回值 成功时返回非负数,失败时返回EOF(-1),并设置 errno。 注: fputs将一个以null符终止的字符串写到指定的流,终止符null本身不写出。通常在null符之前是一个换行符,但并不要求在null符之前一定是换行符。 puts在输出指定字符串后会附加地将一个换行符写到标准输出。安全但个不推荐使用的函数,以免多输出一个换行符。 示例,16,写行,6.4.2 行I/O,程序清单 6-2 ex_io_line.c 1 #include “stdio.h“ 2 #include “string.h“ 3 #include “stdlib.h“ 4 #define BUFSIZE 80 5 6 int main() 7 8 FILE *fp;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号