版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章文件系统编程戴瑾
南大金陵学院信息科学与工程系2主要内容文件系统概述系统调用与库函数基本I/O系统调用文件属性及目录相关系统调用标准I/O库高级I/O库文件系统概述3文件基本概念文件可被读写的对象具备一定权属性,包括访问权限、类型等文件系统文件及其属性的集合,提供了命名及管理机制文件结构字节流,没有特定内部结构文件系统概述文件类型普通文件目录设备文件字符文件/块文件FIFO文件(如管道文件)Socket文件符号链接4文件系统概述5硬连接不同的文件名对应同一个inode不能跨越文件系统相应系统调用link()[root@localhostlink]#ls-ltotal1-rw-r--r--1rootroot667Oct1513:39a[root@localhostlink]#lnab[root@localhostlink]#ls-ltotal2-rw-r--r--2rootroot667Oct1513:39a-rw-r--r--2rootroot667Oct1513:39b[root@localhostlink]#rmarm:remove`a'?y[root@localhostlink]#ls-ltotal1-rw-r--r--1rootroot667Oct1513:39binode/root/linkab文件系统概述6符号链接存储被链接文件的文件名(而不是inode)实现链接可跨越文件系统相应系统调用symlink()[root@localhostsymlink]#ls-ltotal1-rw-r--r--1rootroot667Oct1513:39a[root@localhostsymlink]#ln-sab[root@localhostsymlink]#ls-ltotal1-rw-r--r--1rootroot667Oct1513:39alrwxrwxrwx1rootroot1Oct1514:20b->a[root@localhostyy]#rmarm:remove`a'?y[root@localhostsymlink]#ls-ltotal0lrwxrwxrwx1rootroot1Oct1514:20b->a[root@localhostsymlink]#catbcat:b:Nosuchfileordirectoryinode/root/linkab文件系统概述7文件系统类型Windows文件系统FAT16,FAT32,NTFS传统UNIX:UFS(UnixFileSystem)BSD文件系统:FFS(FastFileSystem)Proc文件系统:只存在于内存中Linux文件系统ext2(在Linux2.0.x中首次使用)reiserfs(在Linux2.2.x中首次使用)ext3(在Linux2.4.x中首次使用)xfs(源于SGI)Jfs(源于IBM)嵌入式小型文件系统CRAMFSJFFS2文件系统概述8Linux的文件系统虚拟文件系统(VFS)虚拟文件系统Ext2Ext3...BufferCache设备驱动进程控制
子系统系统调用接口用户程序进程间通信调度器内存管理硬件文件系统概述9虚拟文件系统模型虚拟化只存在于内存中组成超级块存储已安装文件系统的信息通常对应磁盘文件系统的文件系统控制块文件对象inode对象存储单个文件的信息通常对应磁盘文件系统的文件控制块dentry对象描述文件名及相关联的inode信息文件系统概述10虚拟文件的目录项dentry定义位置:include/linux/dcache.h描述目录与文件的关系树目录高速缓存(directorycache)保存每一个曾被读取的目录/文件的dentry项加快文件查找效率文件系统概述11虚拟文件系统各对象之间关系inode对象与文件:一对一dentry对象与inode对象:多对一(硬连接)文件对象与dentry对象:多对一文件系统概述12EXT2文件系统第一个磁盘块用于引导,其余部分被分成若干组各组大小相同且顺序存放可通过组序号确定组在磁盘上的位置组的构成文件系统超级块所有组描述符数据块位图inode位图inode表数据块文件系统概述13EXT2文件系统体系结构每组都有一份超级块和所有组描述信息的拷贝正常情况下内核只使用第0组的信息当组0的拷贝遭到损坏时便可根据其它组的拷贝恢复数据块位图大小为一个块每一位顺序对应组中的一个块0表示可用1表示已用inode表存放文件及目录的inode数据inode位图表示对应的inode表空间是否已被占用文件系统概述14EXT2索引节点支持多达4TB的数据即一个分区的容量最大可达4TB文件系统概述15文件定位示例文件系统概述16EXT3文件日志文件系统(journalingfilesystem)利用数据库的日志技术(log,checkpoint)3种日志方式journal,ordered,writeback日志记录在/.journal中(隐藏文件)Kjournald—5s文件系统概述17proc文件系统虚拟文件系统,只存在于内存中可查询、设置系统的运行情况及各种系统参数系统中的很多应用都依赖于proc文件系统如命令lsmod等同于cat/proc/modules文件大小为0很多文件名反映了内核的相应参数可通过该文件名修改参数值如#echo2048>/proc/sys/shmmni,修改共享内存段的限制/proc下的“数字目录”指代相应pid的进程如目录“1”下的内容就是1号进程的各种信息文件系统概述18proc文件系统结构文件系统概述19proc文件系统结构—进程文件系统概述20主要内容文件系统概述系统调用与库函数基本I/O系统调用文件属性及目录相关系统调用标准I/O库高级I/O库21系统调用与库函数的基本概念均以C函数形式出现系统调用Linux内核的对外接口用户程序与内核之间的唯一接口提供最小接口程序员手册第二节库函数依赖于系统调用提供较复杂功能例:标准I/O库程序员手册第三节系统调用与库函数22系统调用与库函数的结构视图系统调用与库函数23无缓存I/O与有缓存I/O无缓存I/O读/写->设备文件描述符ANSIC不支持、POSIX支持设备文件访问时使用有缓存I/O标准I/O库提供处理很多细节缓存分配以优化长度执行I/O流->FILE指针普通文件系统调用与库函数24主要内容文件系统概述系统调用与库函数基本I/O系统调用文件属性及目录相关系统调用标准I/O库高级I/O库25基本I/O系统调用文件描述符基本I/Oopen()/creat(),close(),read(),write(),lseek()dup()/dup2()fcntl()ioctl()基本I/O系统调用26文件描述符非负整数定义形式intfd;标准文件描述符定义(<unistd.h>)STDIN_FILENO(0)STDOUT_FILENO(1)STDERR_FILENO(2)文件操作的一般过程打开-读/写-[定位]-关闭基本I/O系统调用27文件操作示例1/*arudimentaryexampleprogram*/#include<fcntl.h>main(){intfd,nread;charbuf[1024];
/*openfile“data”forreading*/fd=open(“data”,O_RDONLY);/*readinthedata*/nread=read(fd,buf,1024);
/*closethefile*/close(fd);}基本I/O系统调用28文件操作示例2基本I/O系统调用29文件操作相关数据类型基本I/O系统调用30出错处理UNIX风格返回值“errno”
变量(/usr/include/errno.h)externinterrno;strerror#include<string.h>char*strerror(interrnum);返回出错的字符串描述perror()#include<stdio.h>voidperror(constchar*msg);打印错误原因字符串基本I/O系统调用31出错处理举例基本I/O系统调用32open()/creat()系统调用功能打开或创建一个文件或设备头文件#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>函数原型intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);intcreat(constchar*pathname,mode_tmode);返回值成功时返回新文件描述符否则返回-1基本I/O系统调用33参数flags说明功能文件访问模式取值说明(/usr/include/fcntl.h)O_RDONLY:只读形式打开O_WRONLY:只写形式打开
O_RDWR:读写形式打开O_APPEND:追加模式打开O_TRUNC:若文件存在且为只读或只写成功打开,则将长度截为0O_CREAT:若文件不存在则创建之使用此选项时,需同时说明参数mode,说明文件的存取许可权位O_EXCL:若同时指定O_CREAT,而文件已经存在,则出错该参数可测试文件是否存在,如果不存在则创建此文件creat()函数说明等价于已参数O_CREAT|O_WRONLY|O_TRUNC执行open()基本I/O系统调用34参数mode说明定义新建文件的访问权限其他用户读、写、执行权限S_IRWXO00007其他用户执行权限S_IXOTH00001其他用户写权限S_IWOTH00002其他用户读权限S_IROTH00004组成员读、写、执权限S_IRWXG00070组成员执行权限S_IXGRP00010组成员写权限S_IWGRP00020组成员读权限S_IRGRP00040所有者读、写、执行权限S_IRWXU(00700)所有者执行权限
S_IXUSR(00100)所有者写权限
S_IWUSR(00200)所有者读权限S_IRUSR(00400)含义取值基本I/O系统调用35close()系统调用功能关闭文件描述符头文件#include<unistd.h>函数原型intclose(intfd);成功:返回0失败:返回-1基本I/O系统调用36read()/write()系统调用read()功能从文件描述符读取数据头文件#include<unistd.h>函数原型ssize_tread(intfd,void*buf,size_tcount);返回值:读到的字节数,若已到文件尾为0,若出错为-1write()功能将数据写入文件描述符头文件#include<unistd.h>函数原型ssize_twrite(intfd,constvoid*buf,size_tcount);返回值:若成功为已写的字节数,若出错为-1基本I/O系统调用37read()/write()系统调用示例基本I/O系统调用38lseek()系统调用功能调节读写的偏移量头文件#include<sys/types.h>#include<unistd.h>函数原型off_tlseek(intfildes,off_toffset,intwhence);返回值成功时返回偏移量位置否则返回-1whence说明SEEK_SET:从文件头开始的偏移量SEEK_CUR:从当前位置开始加offset后的偏移值SEEK_END:从文件末开始加offset后的偏移值基本I/O系统调用39lseek()系统调用示例基本I/O系统调用40文件读写访问示例基本I/O系统调用41dup()系统调用功能复制文件描述符头文件#include<unistd.h>函数原型intdup(intoldfd);传给该函数一个现有描述符,返回一个新的描述符新描述符是传给它的描述符的拷贝,即两描述符共享同一数据结构如果对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的返回值成功时返回新文件描述符否则-1基本I/O系统调用42dup2()系统调用功能复制文件描述符头文件#include<unistd.h>函数原型intdup2(intoldfd,intnewfd);允许规定一个有效描述符(oldfd)和目标描述符(newfd)目标描述符将变成源描述符的复制品,即两个文件描述符指向同一文件,且是源描述符指向的文件返回值成功时返回新文件描述符否则-1基本I/O系统调用43dup()/dup2()系统调用示例基本I/O系统调用44dup()/dup2()系统调用示例基本I/O系统调用4546fcntl()系统调用功能根据文件描述符来操作文件的特性头文件#include<unistd.h>#include<fcntl.h>函数原型intfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);参数说明fd:文件描述符cmd:操作命令arg:命令使用的参数lock:同上返回值若成功,则依赖于cmd若出错为-1基本I/O系统调用47fcntl()系统调用(续)cmd参数说明F_DUPFD:复制文件描述符FD_CLOEXEC:设置close-on-exec标志F_GETFD:读取文件描述符标志F_SETFD:设置文件描述符标志F_GETFL:读取文件状态标志F_SETFL:设置文件状态标志F_GETLK:获取记录锁F_SETLK:释放记录锁F_SETLKW:测试记录锁基本I/O系统调用48fcntl()系统调用示例基本I/O系统调用49主要内容文件系统概述系统调用与库函数基本I/O系统调用文件属性及目录相关系统调用标准I/O库高级I/O库50stat()/fstat()/lstat()系统调用功能获取文件状态头文件#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>函数原型intstat(constchar*file_name,structstat*buf);intfstat(intfiledes,structstat*buf);intlstat(constchar*file_name,structstat*buf);与stat()差别:为符号连接时,lstat()返回连接自身状态返回值成功时返回0否则-1文件属性及目录相关系统调用51structstat结构定义structstat{mode_tst_mode;/*filetype&mode*/ino_tst_ino;/*inodenumber(serialnumber)*/dev_tst_rdev;/*devicenumber(filesystem)*/nlink_tst_nlink;/*linkcount*/uid_tst_uid;/*userIDofowner*/gid_tst_gid;/*groupIDofowner*/off_tst_size;/*sizeoffile,inbytes*/time_tst_atime;/*timeoflastaccess*/time_tst_mtime;/*timeoflastmodification*/time_tst_ctime;/*timeoflastfilestatuschange*/longst_blksize;/*OptimalblocksizeforI/O*/longst_blocks;/*number512-byteblocksallocated*/};文件属性及目录相关系统调用52测试文件类型的宏定义位置<sys/stat.h>socketS_ISSOCK()符号链接S_ISLNK()fifoS_ISFIFO()块文件S_ISBLK()字符文件S_ISCHAR()目录S_ISDIR()普通文件S_ISREG()文件类型宏文件属性及目录相关系统调用53文件类型测试示例文件属性及目录相关系统调用54文件权限其他用户读、写、执行S_IRWXO(00007)其他用户执行S_IXOTH(00001)其他用户写S_IWOTH(00002)其他用户读S_IROTH(00004)组用户读、写、执行S_IRWXG(00070)组用户执行S_IXGRP(00010)组用户写S_IWGRP(00020)组用户读S_IRGRP(00040)所有者读、写执行S_IRWXU(00700)所有者执行
S_IXUSR(00100)所有者写
S_IWUSR(00200)所有者读S_IRUSR(00400)含义
st_mode屏蔽保存文本位
S_ISVTX(01000)在组ID设置执行权限
S_ISGID(02000)在用户ID设置执行权限S_ISUID(04000)文件属性及目录相关系统调用55文件权限示例if(buf.st_mode&S_IRUSR) printf(“readablebyowner”);else printf(“unreadablebyowner”);文件属性及目录相关系统调用56access()系统调用功能按实际用户ID和实际组ID测试文件存取权限头文件#include<unistd.h>函数原型intaccess(constchar*pathname,intmode);返回值成功时返回0否则-1mode参数说明R_OKW_OKX_OKF_OK文件属性及目录相关系统调用57access()系统调用示例文件属性及目录相关系统调用58umask()系统调用功能为进程设置文件存取权限屏蔽字,并返回以前的值头文件#include<sys/types.h>#include<sys/stat.h>函数原型mode_tumask(mode_tmask);文件属性及目录相关系统调用59参数mode与umaskumask文件保护机制新文件的初始访问模式mode&~umask文件属性及目录相关系统调用60umask()系统调用示例文件属性及目录相关系统调用61chmod()/fchmod()系统调用功能更改文件权限头文件#include<sys/types.h>#include<sys/stat.h>函数原型intchmod(constchar*path,mode_tmode);intfchmod(intfildes,mode_tmode);返回值成功时返回0失败返回-1文件属性及目录相关系统调用62chmod()/fchmod()系统调用示例文件属性及目录相关系统调用63chown()/fchown()/lchown()系统调用功能变更文件宿主头文件#include<sys/types.h>#include<unistd.h>函数原型intchown(constchar*path,uid_towner,gid_tgroup);intfchown(intfd,uid_towner,gid_tgroup);intlchown(constchar*path,uid_towner,gid_tgroup);若path为符号连接,lchown()改变连接本身的所有者或组,chown()则改变连接所指向文件的所有者或组返回值成功时返回0失败返回-1文件属性及目录相关系统调用64link()/unlink()系统调用功能创建/删除一个硬链接头文件#include<unistd.h>函数原型intlink(constchar*oldpath,constchar*newpath);intunlink(constchar*pathname);删除一个文件的目录项并减少它的链接数返回值成功时返回0失败返回-1文件属性及目录相关系统调用65link()/unlink()系统调用示例首先使用open先创建一个临时文件然后使用unlink删除文件属性及目录相关系统调用66symlink()/readlink()系统调用功能创建/删除一个符号链接头文件#include<unistd.h>函数原型intsymlink(constchar*oldpath,constchar*newpath);返回值成功时返回0否则-1intreadlink(constchar*path,char*buf,size_tbufsiz);返回值成功时返回放置在buffer中的字符数否则-1文件属性及目录相关系统调用67目录处理相关系统调用创建/删除目录mkdir()/rmdir()更改/获取目录chdir()/fchdir(),getcwd()读取目录信息opendir()/closedir()readdir()telldir()seekdir()文件属性及目录相关系统调用68mkdir()/rmdir()系统调用功能创建/删除一个空目录头文件#include<sys/stat.h>#include<sys/types.h>函数原型intmkdir(constchar*pathname,mode_tmode);intrmdir(constchar*pathname);返回值成功时返回0失败时返回-1文件属性及目录相关系统调用69chdir()/fchdir()系统调用功能更改工作目录头文件#include<unistd.h>函数原型intchdir(constchar*path);intfchdir(intfd);返回值成功时返回0失败时返回-1说明当前工作目录是进程的属性,所以该函数只影响调用chdir的进程本身文件属性及目录相关系统调用70getcwd()系统调用功能获得当前工作目录的绝对路径头文件#include<unistd.h>函数原型char*getcwd(char*buf,size_tsize);返回值成功时返回buf出错则为NULL文件属性及目录相关系统调用71getcwd()系统调用示例文件属性及目录相关系统调用72读取目录信息数据结构DIR,structdirent基本操作opendir()/closedir()readdir()telldir()seekdir()文件属性及目录相关系统调用73基本数据结构DIR目录流对象头文件<dirent.h>定义形式typedefstruct_dirstreamDIR;structdirent目录项头文件<dirent.h>定义ino_td_ino;/*inode号*/chard_name[NAME_MAX+1];/*文件名*/文件属性及目录相关系统调用74目录基本操作功能打开、关闭、读、定位头文件#include<sys/types.h>#include<dirent.h>函数原型DIR*opendir(constchar*name);intclosedir(DIR*dir);structdirent*readdir(DIR*dir);off_ttelldir(DIR*dir);//获取目录流读取位置voidseekdir(DIR*dir,off_toffset);文件属性及目录相关系统调用75目录扫描程序示例文件属性及目录相关系统调用76目录扫描程序示例文件属性及目录相关系统调用77主要内容文件系统概述系统调用与库函数基本I/O系统调用文件属性及目录相关系统调用标准I/O库高级I/O库78文件流缓存I/OStream及“FILE”结构FILE*fp;预定义指针stdinstdoutStderr标准I/O库typedefstruct{intcnt;//余下的字符数
char*ptr;//下一个字符的位置
char*base;//缓冲区的地址
intflag;//存取方式
intfd;//文件描述符}FILE;79FILE结构定义缓冲文件系统为每个正在被使用的文件在内存开辟文件信息区文件信息用FILE结构体描述标准I/O库磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统fclose不关闭文件可能会丢失数据80文件类型指针指针变量说明
FILE*fp;用法文件打开时,系统自动建立文件结构体返回指向它的指针,程序通过这个指针获得文件信息,访问文件文件关闭后,文件结构体被释放文件名文件使用方式文件类型指针C程序操作系统磁盘标准I/O库81标准I/O函数文件流的打开/关闭文件流的读/写每次一个字符的I/O每次一行的I/O直接I/O(二进制I/O)格式化I/O文件流的定位文件流的fflush标准I/O库82fopen()函数功能打开文件流头文件#include<stdio.h>函数原型FILE*fopen(constchar*filename,constchar*mode);mode参数说明“r”:
以读方式打开文本文件“w”:
以写方式创建一个文件,覆盖老文件“a”:
以追加方式打开文件“r+”:
以读写方式打开一个现存文件“w+”:以读写方式打开一个文件若不存在,将创建之若存在,将覆盖原文件“a+”:
以读及追加方式打开文件,若不存在,将创建之“b”:以二进制模式打开文件“t”:以文本模式打开文件标准I/O库83fclose()函数功能打开文件流头文件#include<stdio.h>函数原型intfclose(FILE*stream);返回值成功时返回0否则-1标准I/O库84输入字符头文件#include<stdio.h>函数原型intfgetc(FILE*fp);从文件流中读取下一个字节,并作为字符返回到达文件尾或出现错误时,返回EOFintgetc(FILE*fp);与fgetc()功能类似,但可实现成一个宏intgetchar(void);相当于getc(stdin)标准I/O库85输出字符头文件#include<stdio.h>函数原型intfputc(intc,FILE*fp);向输出文件流写入一个字符intputc(intc,FILE*fp);intputchar(intc);相当于putc(c,stdout)返回值成功时返回写入的字符否则返回-1标准I/O库86字符读写操作示例1标准I/O库87字符读写操作示例2文件拷贝从键盘输入字符,逐个显示到屏幕上并存到磁盘文件中,直到输入‘#“为止读文本文件内容,并显示feof函数原型:intfeof(FILE*fp)功能:判断文件是否结束返值:文件结束,返回真(非0);文件未结束,返回0#include<stdio.h>main(){FILE*in,*out;infile[10],outfile[10];scanf("%s",infile);scanf("%s",outfile);if((in=fopen(infile,"r"))==NULL){
puts("Cannotopeninfile.\n");
exit(0);}if((out=fopen(outfile,"w"))==NULL){puts("Cannotopenoutfile.\n");
exit(0);}
while(!feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);}#include<stdio.h>main(){FILE*fp;charch;if((fp=fopen(“out.txt”,"w"))==NULL){printf("cannotopenfile\n"); exit(0);}printf("Pleaseinputstring:");ch=getchar();while(ch!='#'){putchar(ch);
fputc(ch,fp);ch=getchar();}fclose(fp);}#include<stdio.h>main(){FILE*fp;charch;if((fp=fopen(“out.txt”,”r"))==NULL){printf("cannotopenfile\n");exit(0);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}<>标准I/O库
判断文件是否结束
while(!feof(fp)){ch=fgetc(fp);……..}while(feof(fp)==0)
{ch=fgetc(fp);
……..
}88输入一行字符串头文件#include<stdio.h>函数原型char*fgets(char*s,intsize,FILE*stream);最多读取size-1个字符,并保存在s中遇到EOF或者新行时读操作结束‘\0’保存在s的末尾char*gets(char*s);类似fgets(),但从标准输入读取数据并丢弃遇到的换行符号返回值成功返回指向字符串s的指针失败返回NULL标准I/O库89输出一行字符串头文件#include<stdio.h>函数原型intfputs(constchar*s,FILE*stream);intputs(constchar*s);标准I/O库90字符串读写操作示例2#include<stdio.h>main(){FILE*fp;charstring[81];if((fp=fopen("file.txt","w"))==NULL){printf("cann'topenfile");exit(0);}while(strlen(gets(string))>0){
fputs(string,fp);
fputs("\n",fp);}标准I/O库fclose(fp);if((fp=fopen("file.txt","r"))==NULL){printf("cann'topenfile");exit(0);}while(fgets(string,81,fp)!=NULL)
puts(string);fclose(fp);}91格式化I/O获取外部数据函数头文件#include<stdio.h>函数原型intfprintf(FILE*fp,constchar*format,…)intfscanf(FILE*fp,constchar*format,…)功能按格式对文件进行I/O操作返值成功,返回I/O的个数出错或文件尾,返回EOF例fprintf(fp,“%d,%6.2f”,i,t);//将i和t按%d,%6.2f格式输出到fp文件
fscanf(fp,“%d,%f”,&i,&t);//若文件中有3,4.5,则将3送入i,4.5送入tprintf(“%d,%6.2f”,i,t);//将i和t按%d,%6.2f格式输出到屏幕
scanf(“%d,%f”,&i,&t);//若键盘输入为3,4.5,则将3送入i,4.5送入t标准I/O库92格式化I/O用法示例取指定长度的字符串#include<stdio.h>main(){chars[80],c[80];inta,b;FILE*fp;if((fp=fopen("test","w"))==NULL){
puts("can'topenfile");exit();}标准I/O库scanf("%s%d",s,&a);
fprintf(fp,"%s%d",s,a);
fclose(fp);if((fp=fopen("test","r"))==NULL){puts(“can‘topenfile”);exit();}fscanf(fp,"%s%d",c,&b);printf("%s%d",c,b);fclose(fp);}93流文件的输入/输出功能读/写数据块头文件#include<stdio.h>函数原型size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp);sizefwrite(constvoid*buffer,size_tsize,size_tcount,FILE*fp);参数说明buffer:指向要输入/输出数据块的首地址的指针size:每个要读/写的数据块的大小(字节数)count:要读/写的数据块的个数fp:要读/写的文件指针fread与fwrite主要用于二进制文件的输入/输出返值成功,返回读/写的块数出错或文件尾,返回0标准I/O库94流文件的输入/输出示例1例floatf[2];FILE*fp;fp=fopen(“aa.dat”,“rb”);
fread(f,4,2,fp);for(i=0;i<2;i++){
fread(&f[i],4,1,fp);
f[i]+=10;
}例structstudent{intnum;charname[20];charsex;intage;floatscore[3];}stud[10];for(i=0;i<10;i++)
fread(&stud[i],sizeof(structstudent),1,fp);标准I/O库95流文件的输入/输出示例2#include<stdio.h>#defineSIZE4structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){inti;for(i=0;i<SIZE;i++) scanf("%s%d%d%s",stud[i].name,&stud[i].num, &stud[i].age,stud[i].addr);
save();display();}voidsave(){FILE*fp;inti;if((fp=fopen("d:\\fengyi\\exe\\stu_dat","wb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1) printf("filewriteerror\n");
fclose(fp);}voiddisplay(){FILE*fp;inti;if((fp=fopen("d:\\fengyi\\exe\\stu_dat","rb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++){
fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}
fclose(fp);}标准I/O库96文件定位文件的定位文件位置指针-----指向当前读写位置的指针读写方式顺序读写:每次均以上次读或写入后的下一位置作为本次读或写的起点随机读写:位置指针按需要移动到任意位置rewind函数函数原型voidrewind(FILE*fp)功能重置文件位置指针到文件开头返值无标准I/O库97文件定位示例对一个磁盘文件进行显示和复制两次操作#include<stdio.h>main(){FILE*fp1,*fp2;fp1=fopen("d:\\fengyi\\bkc\\ch12_4.c","r");fp2=fopen("d:\\fengyi\\bkc\\ch12_41.c","w");while(!feof(fp1))putchar(getc(fp1));
rewind(fp1);while(!feof(fp1))putc(getc(fp1),fp2);
fclose(fp1);fclose(fp2);}标准I/O库98文件定位fseek函数函数原型:intfseek(FILE*fp,longoffset,intwhence)功能:改变文件位置指针的位置返值:成功,返回0;失败,返回非0值ftell函数函数原型longftell(FILE*fp)功能:返回位置指针当前位置(用相对文件开头的位移量表示)返值:成功,返回当前位置指针位置;失败,返回-1L文件指针位移量(以起始点为基点,移动的字节数)>0
向后移动<0
向前移动起始点文件开始
SEEK_SET0文件当前位置
SEEK_CUR1文件末尾
SEEK_END2例fseek(fp,100,0);fseek(fp,50,1);fseek(fp,-10,2);起始点文件开始
SEEK_SET0文件当前位置
SEEK_CUR1文件末尾
SEEK_END2标准I/O库99fseek函数示例main(){inti;FILE*fp;if((fp=fopen("studat","rb"))==NULL){printf("can'topenfile\n");exit(0);}scanf(“%d”,&i);
fseek(fp,i*sizeof(structstudent_type),0);
fread(&stud,sizeof(structstudent_type),1,fp);printf("%s%d%d%s\n",,stud.num,stud.age,stud.addr);
fclose(fp);}#include<stdio.h>structstudent_type{intnum;charname[10];intage;charaddr[15];}stud;标准I/O库100fflush()函数功能刷新文件流,把流里的数据立刻写入文件头文件#include<stdio.h>函数原型intfflush(FILE*stream);磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:fflush()不关闭文件可能会丢失数据标准I/O库101出错处理函数ferror()函数函数原型:intferror(FILE*fp)功能:测试文件是否出现错误返值:未出错,0;出错,非0说明每次调用文件输入输出函数,均产生一个新的ferror()函数值,所以应及时测试fopen()打开文件时,ferror()函数初值自动置为0clearerr()函数函数原型:voidclearerr(FILE*fp)功能:使文件错误标志置为0返值:无说明出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数标准I/O库102出错处理函数示例#include<stdio.h>intmain(void){FILE*stream;stream=fopen("DUMMY.FIL","w");getc(stream);if(ferror(stream)){printf("ErrorreadingfromDUMMY.FIL\n");clearerr(stream);}if(!ferror(stream))printf("Errorindicatorcleared!");
fclose(stream);return0;}标准I/O库103文件流缓存操作缓存分类块缓存行缓存无缓存相关函数头文件#include<stdio.h>函数原型voidsetbuf(FILE*stream,char*buf);intsetvbuf(FILE*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44809-2024物联网工业物联网系统设备兼容性要求和模型
- GB/T 44802-2024柔性直流输电用绝缘栅双极晶体管(IGBT)驱动器技术规范
- 高中历史 第一单元 从“朕即皇帝”到“主权在民”第1节 欧洲的君主专制教案 岳麓版选修2
- 2024秋五年级语文上册 第四单元 15 小岛教案 新人教版
- 2023六年级数学上册 6 百分数教案 新人教版
- 湖南省衡阳市高中数学 第一章 集合与函数概念 1.3 函数的基本性质 1.3.1 单调性与最大(小)值教案 新人教A版必修1
- 八年级地理上册 第二章 第三节 气候与人类活动教案1 中图版
- 2024-2025学年高中化学 第一章 物质结构元素周期律 第二节 元素周期律第3课时教案1 新人教版必修2
- 租用家庭氧气瓶合同(2篇)
- 棕榈油供销合同(2篇)
- 华为鸿蒙系统
- 中国城市代码对照表
- 黑水虻处理餐厨垃圾与畜禽粪便的资源化循环利用项目可行性研究报告
- 大学生劳动教育完整PPT全套教学课件
- 国网基建各专业考试题库大全-计划专业(考题汇总)
- 概率论与数理统计智慧树知到答案章节测试2023年中国农业大学
- 六顶思考帽与创新思维训练
- 关于小学科学大单元教学设计的思考
- 模具加工计划进度表-05
- 数学新课程标准的核心概念有哪些?结合教学实践谈谈你的认识
- 红楼梦5000字论文
评论
0/150
提交评论