《教学课件:第六章-文件操作.ppt》由会员分享,可在线阅读,更多相关《教学课件:第六章-文件操作.ppt(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第 4 章章文件的操作文件的操作本章重点 qLinux系统的文件属性q不带缓存的文件I/O操作q基于流的文件I/O操作q特殊文件的操作24.1 Linux系统文件的属性系统文件的属性qLinux系统中,文件的准确定义是不包含有任何其他结构的字符流。qLinux系统提供的文件系统,是树形层次结构系统。qLinux支持多种文件系统,最常用的文件系统是ext2系统。qLinux系统的文件属性主要包括文件类型和文件权限两个方面。注意:注意:FHS标准定义了文件系统中每个区域的用途和所需标准定义了文件系统中每个区域的用途和所需要的最小构成的文件和目录。要的最小构成的文件和目录。34.1.1 Linux
2、文件类型文件类型qLinux下最常见的文件类型有5种:普通文件、目录文件、链接文件、管道文件和设备文件。q例例4.1:设计一个程序,要求列出当前目录下的文件信息,以及系统“/dev/sda1”和“/dev/lp0”的文件信息。q编辑源程序代码:44.1.1 Linux文件类型文件类型qLinux系统的主要文件类型:54.1.2 Linux文件权限文件权限q对于Linux系统中的文件来说,它的权限可以分为4种:可读取(Readable)、可写入(Writable)、可执行(eXecute)和无权限,分别用r、w、x和-表示。qLinux系统按文件所有者、文件所有者同组用户和其它用户三类规定不同的
3、文件访问权限。q显示的作为权限的10个字符,可分为四部分:1.第一位:一般表示文件类型。2.第二位到第四位(第一组rwx):表示文件所有者的访问权限。3.第五位到第七位(第二组rwx):表示文件所有者同组用户的访问权限。4.第八位到第十位(第三组rwx):表示其他用户的访问权限。64.1.2 Linux文件权限文件权限q例例4.2:设计一个程序,要求把系统中“/etc”目录下的passwd文件权限,设置成文件所有者可读可写,所有其他用户为只读权限。q源程序代码:q编译、运行后,使用编译、运行后,使用ls l命令查看命令查看“/etc/passwd”文件的权限文件的权限rootlocalhost
4、 root#ls-l/etc/passwd74.1.2 Linux文件权限文件权限q例例4.3:设计一个程序,要求设置系统文件与目录的权限掩码。q源程序代码:注意:运行一次此例的程序后,修改源程序中注意:运行一次此例的程序后,修改源程序中的掩码后,再次编译运行,文件的掩码后,再次编译运行,文件“liu1”和和“liu2”的权限并不改变。因为如果文件已经的权限并不改变。因为如果文件已经存在,存在,touch只修改时间标记。如果要再次验只修改时间标记。如果要再次验证新的掩码,需要再次运行程序前删除原来的证新的掩码,需要再次运行程序前删除原来的文件。文件。84.1.2 Linux文件权限文件权限qc
5、hmod函数说明 qmode参数说明 94.1.2 Linux文件权限文件权限qumask函数说明 思考题:设计一个程序,要求思考题:设计一个程序,要求Linux系统新建的文件权限系统新建的文件权限 是是0400。104.1.3 Linux文件的其他属性文件的其他属性q文件还有创建时间,大小等其他的属性。q在Linux系统中,定义了stat结构体来存放这些信息。q如果要获得文件的其他属性,可以使用stat函数或者fstat函数。qstat函数用来判断没有打开的文件,而fstat函数用来判断打开的文件。使用较多的属性是st_mode,通过此属性可以判断给定的文件是一个普通文件还是其他文件类型。1
6、14.1.3 Linux文件的其他属性文件的其他属性q例例4.4:设计一个程序,应用系统函数stat获取系统中“/etc”目录下的passwd文件的大小。q源程序代码:124.1.3 Linux文件的其他属性文件的其他属性qstat函数说明 思考题:思考题:1.设计一个程序,要求判断设计一个程序,要求判断“/etc/passwd”的文件类型。的文件类型。使用使用st_mode属性,可以使用几个宏来判断:属性,可以使用几个宏来判断:S_ISLNK(st_mode)是否是一个连接,是否是一个连接,S_ISREG是否是是否是一个常规文件一个常规文件S_ISDIR是否是一个目录,是否是一个目录,S_I
7、SCHR是否是是否是一个字符设备,一个字符设备,S_ISBLK是否是一个块设备,是否是一个块设备,S_ISFIFO是否是否 是一个是一个FIFO文件,文件,S_ISSOCK是否是一个是否是一个SOCKET文件。文件。2.设计一个程序,要求打开文件设计一个程序,要求打开文件“/etc/passwd”,判断它判断它的最后一次访问时间。的最后一次访问时间。134.2 不带缓存的文件不带缓存的文件I/O操作操作qLinux系统中,基于文件描述符的文件操作主要有:不带缓存的文件I/O操作和带缓存的文件流I/O操作。q不带缓存的文件I/O操作,又称系统调用I/O操作,符合POSIX标准,设计的程序能在兼容
8、POSIX标准的系统间方便地移植。q不带缓存的文件I/O操作用到的主要函数:144.2.1 文件的创建文件的创建q例例4.5:设计一个程序,要求在“/home”目录下创建一个名称为“4-5file”的文件,并且把此文件的权限设置为所有者具有只读权限,最后显示此文件的信息。q源程序代码:154.2.1 文件的创建文件的创建qcreat函数说明函数说明 思考题:设计一个程序,要求在思考题:设计一个程序,要求在“/mnt”目录下创建一个目录下创建一个名称为名称为“usb”的文件,编辑、调试成功后,运行两次是的文件,编辑、调试成功后,运行两次是否有问题?为什么?否有问题?为什么?164.2.2 文件的
9、打开和关闭文件的打开和关闭q例例4.6:设计一个程序,要求在“/home”下以可读写方式打开一个名为“4-6file”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。q源程序代码:174.2.2 文件的打开和关闭文件的打开和关闭qopen函数说明函数说明 184.2.2 文件的打开和关闭文件的打开和关闭qclose函数说明函数说明 思考题:设计一个程序,要求在思考题:设计一个程序,要求在“/mnt”目录下,打开名目录下,打开名称为称为“usb”的文件,如果该文件不存在,则创建此文件,的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。如果存在,将文件清空后关
10、闭。194.2.3 文件的读写操作文件的读写操作q文件读写操作中,经常用到的函数是read、write和lseek。q例例4.7:设计一个C程序,完成文件的复制工作。要求通过使用read函数和write函数复制“/etc/passwd”文件到“4-7test”文件中,文件名当程序运行时从键盘键入。q源程序代码:204.2.3 文件的读写操作文件的读写操作qRead、write函数说明函数说明 思考题:思考题:1.设计一个程序,使用设计一个程序,使用read函数从源文件读取数据,再用函数从源文件读取数据,再用write函数写入到目标文件,源文件名和目标文件名都由函数写入到目标文件,源文件名和目标
11、文件名都由键盘输入。键盘输入。2.设计一个程序,要求在设计一个程序,要求在“/mnt”目录下,打开名称为目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件,如的文件,如果该文件不存在,则创建此文件,如果已存在,把字符串果已存在,把字符串“usb作为优盘设备文件作为优盘设备文件”写入此文写入此文件后关闭。件后关闭。214.2.4 文件上锁文件上锁qLinux系统中,给文件上锁主要有建议性锁和强制性锁。给文件加建议性锁的是flock函数,给文件加强制性锁的是fcntl函数。q一般情况下,系统使用强制性锁,而很少使用建议性锁。当一个文件被上锁后,内核将阻止其他任何文件对其进行读写操作
12、。q例例4.8:设计一个程序,要求在“/home”下打开一个名为“4-8file”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。q源程序代码:224.2.4 文件上锁文件上锁注意:程序在终端中运行后会暂停,注意:程序在终端中运行后会暂停,需要按任意健后程序才会继续运行。需要按任意健后程序才会继续运行。234.2.4 文件上锁文件上锁qflock、fcntl函数说明函数说明 思考题:设计一个程序,要求在思考题:设计一个程序,要求在“/mnt”目录下,打开名目录下,打开名称为称为“usb”的文件,如果该文件不存在,则创建此文件。的文件,如果该文件不存在,则创
13、建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。打开后对其加上强制性的写入锁,然后释放写入锁。244.3 带缓存的流文件带缓存的流文件I/O操作操作q带缓存的流文件I/O操作,是在内存开辟一个“缓存区”,为程序中的每一个文件使用。q内存“缓存区”的大小,影响着实际操作外存的次数,内存“缓存区”越大,则操作外存的次数就少,执行速度就快、效率高。q带缓存的文件I/O操作用到的主要函数 254.3.1 流文件的打开和关闭流文件的打开和关闭q例例4.9:设计一个程序,要求用流文件I/O操作打开文件“4-9file”,如果该文件不存在,则创建此文件。q源程序代码:思考题:设计一个程序,要求用带缓
14、存的流文件思考题:设计一个程序,要求用带缓存的流文件I/O操作,操作,在在“/tmp”目录下,打开名称为目录下,打开名称为“tmpfile”的文件,如果的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后该文件不存在,则创建此文件,如果存在,将文件清空后关闭。关闭。264.3.2 流文件的读写操作流文件的读写操作q例例4.10:设计一个程序,要求把键盘上输入的字符写入文件“4-10file”,如果该文件不存在,则创建此文件。q源程序代码:思考题:思考题:1.程序运行后,输入的字符如果是半角的中文,文件中能程序运行后,输入的字符如果是半角的中文,文件中能否写入?为什么?否写入?为什么?
15、2.设计一个程序,要求用带缓存的流文件设计一个程序,要求用带缓存的流文件I/O操作,利用操作,利用fputc函数把键盘上输入的字符串写入文件函数把键盘上输入的字符串写入文件“/tmp/4-10tmp”,如果该文件不存在,则创建此文件。如果该文件不存在,则创建此文件。274.3.2 流文件的读写操作流文件的读写操作q例例4.11:设计一个程序,要求把键盘上输入的字符写入文件“4-11file”,如果该文件不存在,则创建此文件。q源程序代码:思考题:思考题:1.设计一个程序,要求用带缓存的流文件设计一个程序,要求用带缓存的流文件I/O操作,把键盘上操作,把键盘上输入的字符串写入文件输入的字符串写入
16、文件“/tmp/4-11tmp”,如果该文件不如果该文件不存在,则创建此文件,多次运行程序多次输入字符串后,存在,则创建此文件,多次运行程序多次输入字符串后,文件文件“/tmp/4-11tmp”中只保存最后一次输入的字符串。中只保存最后一次输入的字符串。2.设计一个程序,要求用带缓存的流文件设计一个程序,要求用带缓存的流文件I/O操作,把文件操作,把文件“/tmp/4-11tmp”中的内容读取出来,在终端中打印输出。中的内容读取出来,在终端中打印输出。284.3.1 流文件的打开和关闭流文件的打开和关闭q例例4.12:设计两个程序,要求一个程序把三个人的姓名和帐号余额信息,通过一次流文件I/O
17、操作写入文件“4-12file”,另一个格式输出帐号信息,把每个人的帐号和余额一一对应显示输出。q4-12fwrite.c,4-12fread.c程序代码:思考题:思考题:1.完善例完善例4.12的程序,使得帐号和余额都可以从键盘输入,余额的程序,使得帐号和余额都可以从键盘输入,余额可以输入小数。可以输入小数。2.设计一个程序,要求把一个文本文件设计一个程序,要求把一个文本文件“4-12test”中的数据读出,中的数据读出,文本文件文本文件“4-12test”有两列数据,第一列是帐号有两列数据,第一列是帐号(11位整数表位整数表示示),第二列是帐号余额,第二列是帐号余额(double数据类型数
18、据类型),两列数据间用逗号,两列数据间用逗号隔开,按帐号余额从小到大排序后,把排序后的数据写入文本隔开,按帐号余额从小到大排序后,把排序后的数据写入文本文件文件“4-12sort”,帐号要和余额一一对应。,帐号要和余额一一对应。294.3.4 文件的定位文件的定位q实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有三个,即 rewind 函数、fseek函数和ftell函数。q例例4.13:设计一个程序,要求用fopen函数打开系统文件“/etc/passwd”,先把位置指针移动到第10个字符前,再把位置指针移动到文件尾,最后把位置指针移动到文
19、件头,输出三次定位的文件偏移量的值。q源程序代码:思考题:设计一个程序,要求从系统文件思考题:设计一个程序,要求从系统文件“/etc/passwd”读取偏移量从读取偏移量从100至至200之间的字符,写入之间的字符,写入“/tmp/pass”文文件。件。304.4.1 目录文件的操作目录文件的操作q目录文件是Linux中一种比较特殊的文件,它是Linux文件系统结构中骨架,对构成整个树型层次结构的Linux文件系统非常重要。q对目录文件的操作可以使用mkdir函数、opendir函数、closedir函数、readdir函数和scandir函数等。314.4.1 目录文件的操作目录文件的操作q
20、例例4.14:设计一个程序,要求读取系统目录文件“/etc/rc.d”中所有的目录结构。q源程序代码:源程序代码:思考题:设计一思考题:设计一个程序,要求读个程序,要求读取取“/etc”目录目录下所有的目录结下所有的目录结构,并依字母顺构,并依字母顺序排列。序排列。324.4.2 链接文件的操作链接文件的操作qLinux系统中的链接文件,有点类似于Windows系统中的“快捷方式”,但并不完全一样。1.软链接文件软链接文件q软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为“断链”的问题,
21、链接文件甚至可以循环链接自己。类似于编程语言中的递归。334.4.2 链接文件的操作链接文件的操作q例例4.15:设计一个程序,要求为“/etc/passwd”文件建立软链接“4-15link”,并查看此链接文件和“/etc/passwd”文件。q源程序代码:思考题:设计一思考题:设计一个程序,要求为个程序,要求为“/bin”目录文目录文件建立软链接为件建立软链接为“bin”,并查看,并查看此链接文件和此链接文件和“/bin”目录文目录文件。件。344.4.2 链接文件的操作链接文件的操作2.硬链接文件硬链接文件q对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果删除硬链接文件的源文
22、件,硬链接文件仍然存在,而且保留了愿有的内容,这时,系统就“忘记”了它曾经是硬链接文件,而把它当成一个普通文件。q硬链接文件有两个限制:1.不允许给目录创建硬链接;2.只有在同一文件系统中的文件之间才能创建链接。354.4.2 链接文件的操作链接文件的操作q例例4.16:设计一个程序,要求为“/etc/passwd”文件建立软链接“4-16link”,并查看此链接文件和“/etc/passwd”文件。q源程序代码:思考题:设计一思考题:设计一个程序,要求为个程序,要求为“/bin/ls”文件文件建立硬链接为建立硬链接为“ls”,并查看,并查看此链接文件和此链接文件和“/bin/ls”文件。文件
23、。36思考与实验思考与实验1.设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件,权限设置为只有所有者有只读权限。2.设计一个程序,要求新建一个文件“hello”,利用write函数将“Linux下c软件设计”字符串写入该文件。3.设计一个程序,要求利用read函数读取系统文件“/etc/passwd”,并在终端中显示输出。37思考与实验思考与实验4.设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件;读取系统文件“/etc/passwd”,把文件中的内容都写入“pass”文件。5.设计一个程序,要求将10分别以十进制、八进制和十六进制输出。6.设计一个程序,要求新建一个目录,预设权限为-x-x-x-。7.设计一个程序,要求为“/bin/ls”文件建立一个软链接“ls1”和一个硬链接为“ls2”,并查看两个链接文件和“/bin/ls”文件。38