C语言课程之一高级编程部分-标准IO

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

上嵌网院讲师:任继梅系列课程—C语言高级编程标准I/O第二章课程目标掌握C语言自定义类型•结构体的定义和使用、共用体、链表的建立和基本操作掌握C语言的存储方式•存储类、链接、内存管理掌握线性表和常用的数据结构•线性表、存储方式、顺序表、链表、队列、栈掌握常用的查询和排序算法•顺序查询、折半查询、插入排序、选择拍寻掌握动态链接库和静态链接库课程安排第一天上午:自定义数据类型下午:链表的建立和基本操作第二天上午:数据的存储方式下午:线性表第三天上午:队列下午:栈第四天上午:查找下午:排序第五天上午:其他常用算法下午:静态链接库和动态链接库结构体是如何定义的?2.如何引用结构体成员?3.指针怎样引用结构体成员?4.什么是共用体?5.怎么样建立链表?6.如何删除链表的一个节点?本章目标了解文件的基本概念•文件的基本分类•File指针•标准I/O流掌握文件的常见操作•fopen/fclose•fgets/fputs•fgetc/fputc•fwrite/fread知识点1-文件概念:•定义:文件:一组相关数据的有序集合。文件名:这个数据集合的名称。•按类型分类:–常规文件•ASCII码文件•二进制的文件–目录–字符设备–块设备–有名管道–套接口–符号链接文件概念文件类型:常规文件:这种文件包含了某种形式的数据目录文件:包含其他文件的名字以及指向与这些文件有关的信息指针。字符设备:这种类型提供对设备不带缓冲的访问,每次访问长度可变。块设备:这种文件类型提供对设备带缓冲的访问,每次访问以固定长度为单位经行。FIFO:用于进程间通信套接字:用于进程间的网络通信符号链接:这种文件类型指向另一个文件。知识点2-流和file对象•不仅在UNIX系统,在很多操作系统上都实现了标准I/O库•标准I/O库由ANSIC标准说明•标准I/O库处理很多细节,如缓存分配、以优化长度执行I/O等,这样使用户不必关心如何选择合适的块长度•标准I/O在系统调用函数基础上构造的,它便于用户使用•标准I/O库及其头文件stdio.h为底层I/O系统调用提供了一个通用的接口。•文件指针–FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。–标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE*来描述。–标准I/O库是由DennisRitchie在1975年左右编写的•流(stream)–定义:所有的I/O操作仅是简单的从程序移进或者移出,这种字节流,就称为流。–分类:文本流/二进制流。流和FILE对象•文本流–定义:在流中处理的数据是以字符出现。在文本流中,’\n’被转换成回车符CR和换行符LF的ASCII码0DH和0AH。而当输出时,0DH和0AH被转成’\n’–数字2001在文本流中的表示方法为‘2’‘0’‘0’‘1’ASCII:50484849•二进制流–定义:流中处理的是二进制序列。若流中有字符,则用一个字节的二进制ASCII码表示;若是数字,则用对应的二进制数表示。对’\n’不进行变换–数字2001在二进制流中的表示方法为0000011111010001。知识点3-文件缓冲•缓冲文件系统(高级磁盘IO)–目的:尽量减少使用read/write的调用–定义:系统自动的在内存中为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存缓冲区,装满缓冲区在一起送到磁盘中去。从磁盘中读数据,则一次从磁盘文件将一批数据读入到内存缓冲区中,然后再从缓冲区逐个的将数据送到程序的数据区。–分类:全缓存,行缓存,不缓存。•非缓冲文件系统(低级磁盘IO)–定义:依靠于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出。缓存分类•标准I/O提供了三种类型的缓存–全缓存•当填满I/O缓存后才进行实际I/O操作,或者满足一定条件后,系统通过调用malloc来获得所需要的缓冲区域,默认值。•刷新(fflush):标准I/O的写操作。当缓冲区满了,或者满足一定的条件后,就会执行刷新操作。–行缓存•当在输入和输出中遇到换行符(‘\n’)时,进行I/O操作。当流遇到一个终端时,典型的行缓存。–不带缓存•标准I/O库不对字符进行缓冲,例如stderr。•很多的人机交互界面要求不可全缓存。•标准出错决不会是全缓存的。•使用setbuf()和setvbuf()可以更改缓存的类型•在任何时刻,可以使用fflush强制刷新一个数据流•定义:#includestdio.hintfflush(FILE*fp);•说明:–可强制刷新一个流。此函数使该流所有未写的数据都被传递至内核。知识点4-stdin,stdout,stderr标准输入0STDIN_FILENOstdin标准输出1STDOUT_FILENOstdout标准错误输出2STDERR_FILENOstderr•标准I/O预定义3个流,他们可以自动地为进程所使用定义函数:intfprintf(FILE*stream,constchar*format,...);函数说明:fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束('\0')为止。Stream可以是表顺输入输出流相关函数:printf,fscanf,vfprintf头文件:#includestdio.h示例#includestdio.hmain(){inti=150;intj=-100;doublek=3.14159;fprintf(stdout,%d%f%x\n,j,k,i);fprintf(stdout,%2d%*d\n,i,2,i);}#includestdio.hintmain(){inti;if(freopen(D:OUTPUT.txt,w,stdout)==NULL)fprintf(stderr,errorredirecting\stdout\n);for(i=0;i10;i++)printf(%3d,i);printf(\n);fclose(stdout);return0;}文件stdIOSample1.c,实现了从stdout到一个文本文件的重定向。即,把输出到屏幕的文本输出到一个文本文件中。知识点5-打开流•下列三个函数可用于打开一个标准I/O流:–FILE*fopen(constchar*path,constchar*mode);–FILE*freopen(constchar*restrictpathname,constchar*restricttype,FILE*restrictfp)–FILE*fdopen(intfiledes,constchar*type);fopen()打开由path指定的一个文件。mode的值如下:()-mode参数•打开标准I/O流的mode参数:r或rb打开只读文件,该文件必须存在。r+或r+b打开可读写的文件,该文件必须存在。w或wb打开只写文件,若文件存在则文件长度清为0,即会擦些文件以前内容。若文件不存在则建立该文件。w+或w+b或wb+打开可读写文件,若文件存在则文件长度清为零,即会擦些文件以前内容。若文件不存在则建立该文件。a或ab以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。a+或a+b或ab+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。*当给定“b”参数时,表示以二进制方式打开文件。()-mode参数打开一个标准I/O流的六种不同方式:()-example•stdIOSample2.c:–以读写方式打开文件file_3,如果该文件不存在,则创建。如果该文件已经存在,则长度截短为0。•stdIOSample3c:–以读写方式打开文件test.c,如果该文件不存在,则报错。–如果该文件已经存在,改变进程的标准输出,改标准输出到test.c文件中。()-example()-example库-fopen()文件permission•fopen()没有设定创建文件权限的参数,•POSIX.1要求具有如下权限(0666或者-rw-rw-rw):–S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH•用户可以通过umask修改文件存取的权限,其结果为(0666&~umask)•文件打开练习题设计c程序stdIOExercise1.c,实现以只读的方式打开文件in.txt,以只写方式打开out.txt,如果出现错误,则打印错误信息知识点6-fclose()fclose()用于关闭一个已经打开的流:intfclose(FILE*stream);•fclose()调用成功返回0,失败返回EOF,并设置errno•在该文件被关闭之前,刷新缓存中的数据。如果标准I/O库已经为该流自动分配了一个缓存,则释放此缓存。•当一个进程正常终止时(直接调用exit函数,或从main函数返回),则所有带未写缓存数据的标准I/O流都被刷新,所有打开的标准I/O流都被关闭。•在调用fclose()关闭流后对流所进行的任何操作,包括再次调用fclose(),其结果都将是未知的。练习:设计程序stdIOExercise2.c利用标准I/O函数来测试当前系统最大能打开的文件个数。知识点6-读写流调用fopen()成功打开流之后,可在三种不同类型的非格式化I/O中进行选择,对其进行读、写操作:每次一个字符的I/O。使用fgetc()/fputc()一次读或写一个字符,如果流是带缓存的,则标准I/O函数处理所有缓存。每次一行的I/O。使用fgets()和fputs()一次读或写一行。每行都以一个换行符终止。当调用fgets()时,应说明能处理的最大行长。直接I/O。fread()和fwrite()函数支持这种类型的I/O。每次I/O操作读或写某种数量的对象,而每个对象具有指定的长度。这两个函数常用于从二进制文件中读或写一个结构。读写流结束判定•feof()–判断文件是否结束,可用于二进制文件。intcTemp;while(!feof(fp)&&!ferror(stdin)){cTemp=fgetc(fp);}•EOF/feof()–EOF文件结束的返回标志,一般使用方法:intcTemp;cTemp=fgetc(fp);whil

1 / 43
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功