版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,丛
本章的要求飞
♦掌握Linux中系统调用的基本概念\
♦掌握Linux中用户编程接口(API)及系统
命令的相互关系
♦掌握文件描述符的概念
♦掌握Linux下文件相关的不带缓存工/0函数
的使用
♦掌握Linux下设备文件读写方法
♦熟悉Linux中标准文件工/0函数的使用
2
本章的主要内容
Linux系统调用及用户编程接口(AP工)
Linux中文件及文件描述符概述
底层文件工/。操作
嵌入式Linux串口应用编程
标准工/0编程
实验
3
1Linux系统调用及用户编程接口
(API)
4
系统调用
•所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”
接口,用户程序可以通过这组“特殊”接口来获得操作系统内核
提供的服务。(例如用户可以通过进程控制相关的系统调用来创
建进程、实现进程调度、进程管理等。)
•为什么用户程序不能直接访问系统内核提供的服务呢?这是由于
在Linux中,为了更好地保护内核空间,将程序的运行空间分为
内核空间和川户空间(也就是常称的内核态和用户态),它
们分别运行在不同的级别上,在逻辑上是相互隔离的。因此,ffl
户进程在通常情况下不允许访问内核数据,也无法使用内核函数,
它们只能在用户空间操作用户数据,调用用户空间的函数。
但是,在有些情况下,用户空间的进程需要获得一定的系统服务
(调用内核空间程序),这时操作系统就必须利用系统提供给用
户的“特殊接口”—系统调用规定用户进程进入内核空间的具
0进行系统调用时,程序运行空间需要从用户空间进入内
亥空间,处理完后再返回到用户空间。
5
API
•前面讲到的系统调用并不是直接与程序员进行交互的,它仅仅是
一个通过软中断机制向内核提交请求,以获取内核服务的接口。
在实际使用中程序员调用的通常是用户编程接口一一API
•系统命令(如SHELL命令)相对API更高了一层,它实际上一个可
执行程序,它的内部引用了用户编程接口(APD来实现相应的
功能。
应用程序
(系统命令,其他应用程序)
用户空间
用户编程接口API
系统调用
内核空间
6
2Linux中文件及文件描述符概述
7
文件描述符
•Linux中的文件主要分为4种:普通文件、目录文件、链接文件
和设备文件。
是使用文件描述符来进行的。文件描述符是一个非负的整数,它
是一个索弓值,并指向在内核中每个进程打开文件的记录表。当
打开一个现存文件或创建一个新文件时,内核就向进程返回一个
文件描述钱;当责要读写文件时,也需要把文件描述符作为参数
传递给相应的函数。
•通常,一人进程启动时,都会打开3个文件:标准输入、标准输
出和标准出错处理。这3个文件分别对应文件描述符为0、1和2
(也就是宏替换STD工N_F1LENO、STDOUT_FILENOW
^STDERR.FILENO)o—一
8
•基于文件描述符的工/0操作虽然不能移植到类Linux以外的系统
上去(如Windows),但它往往是实现某些工/O操作的惟一途径,
如Linux中低级文件操作函数、多路工/0、TCP/工P套接字编程接
口等。同时,它们也很好地兼容POS1X标准,因此,可以很方
便地移植到任何POSJIX平台上。基于文件描述符的工/O操作是
Linux中最常用的操作之一。
•先来看看不带缓存的"0和标准(带缓存的)工/0都有那些
,不带缓存的工/0:read,write,open....
,标准(带缓存的)工/0:fgetszfreadzfwrite..…
•这里使用两个对应的函数进行比较:
•ssize_twrite(intfiledes,constvoid*buffzsize_tnbytes)
,size_tfwrite(constvoid*ptr,size_tsize,size_tnobj,FILE
*fp)
•上面的buff和ptr都是指应用程序自己使用的buffer,实际上
当需要对文件丑行写操作时,都会先写到内核所设的缓冲存储器。
再进行实际的1/6操作,血就是此高于把数据黄正写到磁盘,应
种技未叫延迟写。
10
如果我们直接用非缓存工/。对内核的缓冲区进行读写,会产生许多管理
不善而造成的麻烦(如一次性写入过多,或多次系统调用导致的效率低
下)。
标准(带缓存的)工/。为我们解决了这些问题,它处理很多细节,如缓冲
区分配,以优化长度执行工/0等,更便于我们使用。
由于标准(带缓存的)工/0在系统调用的上一层多加了一个缓冲区,也因
此引入了流的概念,在UN工X/Linux下表示为F工LE*(并不限于
UNIX/Linux,ANSIC都有FILE的概念),FILE实际上包含了为管
理流所需要的所有信息:实际工/0的文件描述符,指向流缓存的指针
(标准工/0缓存,由malloc分配,又称为用户态进程空间的缓存,区别
于内核所设的缓存),缓存长度,当前在缓存中的字节数,出错标志等。
因此可知,不带缓存的工/O对文件描述符操作,带缓
G存的标准工/O是针对流的。
11
•标准工/0对每个工/O流自动进行缓存管理(标准工/。函数通常
调用malloc来分配缓存)。它提供了三种类型的缓存:
•1)全缓存。当填满标准工/O缓存后才执行工/O操作。磁盘上的
文件通常是全缓存的。
•2)行缓存。当输入输出遇到新行符或缓存满时,才由标准工/O
库执行实际工/O操作。
,stdin、stdout通常是行缓存的。
,3)无缓存。相当于read、writeTostderr通常是无缓存的,
同为它必须尽快输出。
•一般而言,由系统选择缓存的长度,并自动分配。标准工/0库在
关闭流的时候自动释放缓存。
•另外,也可以使用函数fflush()将流所有未写的数据送入(刷新)
到内核、(内核缓冲区),fsync()将所有内核缓冲区的数据写到
12
•在标准工/0库中也有引入缓存管理而带来的缺点一效率问题。例
如当使用每次一行函数fgets和fputs时,通常需要复制两次数
据:一次是在内核和标准工/0缓荐之间(当调用rccicl和write
时),第二次是在标准工/0缓存(通常系统分配和管理)和用户
程序中的行缓存(fgets的参数就需要一个用户行缓存指针)之
间。
13
3不带缓存的文件工/0操作
14
函数说明
•open。函数是用于打开或创建文件,在打开或创建文件时可以指、
定文件的属性及用户的权限等各种参数。
•close。函数是用于关闭一个被打开的文件。当一个进程终止时,
所有被它打开的文件都由内核自动关闭,很多程序都使用这一功
能而不显不如关闰一个文件。
•read。函数是用于将从指定的文件描述符中读出的数据放到缓存
区中,并返回实际读入的字节数。若返回0,则表示没有数据可
读,即已达到文件尾。读操作从文件的当前指针位置开始。当从
终端设备文件中读出数据时,通常一次最多读一行。
•write。函数是用于向打开的文件写数据,写操作从文件的当前指
针位置开始。对磁盘文件进行写操作,若磁盘已满或超出该文件
的长度,则wr汁c()函数返回失败。
•IscekO函数是用于在指定的文件描述符中将文件指针定位到相应
的位置。它只能用在可定位(可随机访问)文件操作中。管道、
套接字和大部分字符设备文件是不可定位的,所以在这些文件的
口无法使用lscck()调用。
15
open。语法要点
#include<sys/types.h>/*提供类型pid_t的定义%」
所需头文件。#include<sys/stat.h>^
#include<fcntl.h>p
函数原型。intopen(constchar*pathname,intflags,intperms"
pathname*21被打开的文件名(可包括路径名)-
O_RDONLY:以只读方式打开文件。
O_WRONLY:以只写方式打开文件Q
(J_RDWR:以读写方式打开文件,
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参
数为其设置权限
O_EXCL:如果使用。_CREAT时文件存在,则可返回错误消息、。这一
flag:文件打套致可测试文件是否言。此时。pen是原子操作,防止多个进程同时
开的方式创建同一个文件。*
O.NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调
函数传入值。用open。的那个进程的控制终端衰
O_TRUNC:若文件已经存在,那么会删除文件中的全部原有数据,并
且设置文件大小为0。9
O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指
向文件的末尾,即将写入的数据添加到文件的末尾。一
被打开文件的存取权限。~
可以用一组宏定义:S_I(R/W/X)(USR/GRP/OTH>
其中R/WX分别表示读/写秋行权限.
perms-
USR/GRP/OTH分别表示文件所有者/文件所属组/其他用户。~
例如SJRUSR|S」WUSR表示设置文件所有者的可读可写属性。八进
制表示法中6。0也表示同样的权限。-
16
成功:返回文件描述符,
函数返回值P
失败:-3
close。语法要点
所需头文件2#include<unistd.h>*'
函数原型。intclose(intfd)<
函数输入值一fd:文件描述符。
0:成功J
函数返回值一
-1:出错r
read。语法要点
所需头文件。#include<unistd.h>^
函数原型一ssize_tread(intfd,void*buf,size_tcount*
fd:文件描述符“
函数传入值qbuf:指定存储器读出数据的缓冲区2
count:指定读出的字节数石
成功:读到的字节数1
&函数返回值。0:已到达文件尾।
-1:出错二
write。语法要点
所需头文件”#mclude<unistd.h>-
函数原型。ssize_twrite(intfd,void*buf,size_tcount)*
fd:文件描述符。
函数传入值。buf:指定存储器写入数据的缓冲区〃
count:指定读出的字节数,
成功:已写的字节数,
函数返回值2
-1:出错一
lseek()语法要点
#include<unistd.h>^
所需头文件“
#include<sys/types.h>^
函数原型Qoff_tlseek(intfd,off_toffset,intwhence)*3
fd:文件描述符.,
函数传入值"offset:偏移量,每一读写操作所需要移动的距离,单位是字节,可正可负(向
前移,向后移〉2
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小,
whence:。SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上
当前位置偏移量2
的基点Q
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏
移量的大小”
成功:文件的当前位移1
函数返回值。
-1:出错/
实验1\
•基本功能:从一个文件(源文件,以只读方式打开)
中读取最后10KB数据并复制到另一个文件(目标文件,
以只写方式打开)。如果目标文件不存在,可以创建
并设置权限的初始值为644(文件所有者可读可写,
文件所属组合其他用户只能读)。
19
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#defineBUFFER_SIZE1024
#defineSRC_FILE_NAME"/lib/libm.so.6"
#defineDEST_FILE_NAME"dest_file"
#defineOFFSET1024
intmain()
{
intsrc_fila,dest_file;
unsignedcharbuff[BUFFER_SIZE];
intreal_read_len;
src_file=open(SRC_FILE_NAME,0_RbONLy);
版馥㈱艘蔑犒NAME,WyQ,REATQRUSRlSJ
if(src_file<0||dest_file<0)
(
printf("Openfileerror\n");
exit(l);
}
lseak(src_file,-OFFSET,5EEK_END);
while((neal_read_len=nead(src_file/buff/sizeof(buff)))>0)
(
write(dest_file,buff^eaLreadJen);
)
close(dest_file);
close(src_file);
return0;
21
实验2
open函数带有3个flag参数:O_CREAT、O_TRUNC和
O_WRONLY,这样就可以对不同的情况指定相应的处理方法
22
实验3
open函数返回的文件描述符一定是最小的未用文件描述符。
由于一个进程在启动时自动打开了0、1、2三个文件描述符,
因此,该文件运行结果中返回的文件描述符为3。读者可以尝
试在调用open函数之前,加依据close(O),则此后在open函
数时返回的文件描述符为0
文件锁个
•前面的这5个基本函数实现了文件的打开、读写等基本操才
这一节将讨论的是,在文件已经共享的情况下如何操作,
也就是当多个用户共同使用、操作一个文件的情况,这时,
Linux通常采用的方法是给文件上锁,来避免共享的资源
产生竞争的状态。
•文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁
文件的进程都要检查是否有锁存在,并且尊重已有的锁。
在一般情况下,内核和系统都不使用建议性锁。强制性锁
是由内核执行的锁,当一个文件被上锁进行写入操作的时
候,内核将阻止其他任何文件对其进行读写操作。采用强
制性锁对性能的影响很大,每次读写操作都必须检查是否
有锁存在。
24
•在Linux中,实现文件上锁的函数有lockf()和fcntl(),其中
lockf()用于对文件施加建议性锁,而fcntR)不仅可以施加
建议性锁,还可以施加强制锁。同时,fcntl()还能对文件
的某一记录上锁,也就是记录锁。
•记录锁又可分为读取锁和写入锁,其中读取锁又称为共享
锁,它能够使多个进程都能在文件的同一部分建立读取锁。
而写入锁又称为排斥锁,在任何时刻只能有一个进程在文
件的某个部分上建立写入锁。当然,在文件的同一部分不
能同时建立法取筋和写入锁。
fcntl()函数格式(1)
J----------------------------------------------
#include<sys/types.h>»1
所需头文件」#include<unistd.h>-
#include<fcntl.h>^
函数原型“intfcntl(intfd,mtcmd,structflock*lock)^
fd:文件描述符.、
F_DUPFD:复制文件描述符・
F_GETFD:获得fd的close-on-exec标志,君扬常术设置,则文件经过exec。函
©之后仍保持打开状态一
F_SETFD:设置close-on-exec标志,该标志由参数arg的FD_CLOEXEC位法庭:
F_GETFL:得到open设置的标志”
函数传入值•cm*
F_SETFL:改变open设置的标志
F_GETLK:根据lock描述,决定是否上文件锁“
F_SETLK:设置lock描述的文件锁.、
F_SETLKW:这是F_SETLK的阻塞版本(命令名中的W表示等待(wait))
在无法获取锁时,会进入睡眠状态;如果可以获取钺逸煮捕捉到信号则会返回
1lock:结构为flock,设置记录锁的具体状态,后面会详细说明2
成功:CU
函数返回值-
二-1:出错2
26
fcntl()函数格式(2)-
叫flock结构
shortl_type;
off_tl_start;
shortl_whence;
off_tIJen;
pid_tl_pid;
F_RDLCK:读取锁(共享锁〉P
FWRLCK:写入锁(排斥锁)
FliNLCK:解锁q
相对位移量《字节》
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小.,
会的起点(同keekSEEKCUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。
的whence)。
SEEK_ENI):当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
加他或麻葭
27
实验4
28
工/。处理的模型
•阻塞工/O模型:在这种模型下,若所调用的工/O函数没有完成相
关的功能,则会使进程挂起,直到相关数据到达才会返回。如常
见对管道设备、终端设备和网络设备进行读写时经常会出现这种
情况。(如实验4中的阻塞加锁)
•非阻塞模型:在这种模型下,当请求的1/0操作不能完成时,则
不让进程睡眠,而且立即返回。非阻塞1/0使用户可以调用不会
阻塞的1/0操作,如open。、write()ffread()o如果该操作不能
完成,则会立即返回出错(例如:打不开文件)或者返回0(例
如:在缓冲区中没有数据可以读取或者没空间可以写入数据)。
29
•工/O多路转接模型:在这种模型下,如果请求的工/。操作阻塞,
且它不是真正阻塞工/0,而是让其中的一个函数等待,在这期间,
工/0还能进行其他操作。如本节要介绍的select。和poll函数(),
就是属于这种模型。
•信号驱动]70模型:在这种模型下,通过安装一个信号处理程序,
系统可以自动捕获特定信号的到来,从而启动工/0。这是由内核
通知用户何时可以启动一个工/0操作决定的。
•异步工/O模型:在这种模型下,当一个描述符已准备好,可以启
动工/0时,进程会通知内核。现在,并不是所有的系统都支持这
种模型。
select。和poll。
•select。和poll。的工/O多路转接模型是处理工/O复用
的一个高效的方法。它可以具体设置程序中每一个所
关心的文件描述符的条件、希望等待的时间等,从
select。和poll。函数返回时,内核会通知用户已准备
好的文件描述符的数量、已准备好的条件等。通过使
用select。和poll。函数的返回结果,就可以调用相应
的工/0处理函数了。
31
select。函数格式(1)
耳include<sys-hpes.li
所需头文件”include<sxs/tiine.h•
丽chide<imistd1I>P
intselect(mtnunifds,fdsetlreadfds,fdset'xvntefds?-、
函数原型〃
fdset1cxeptfds.structtuneAal1timeout)*1
numfds:该参数值为需要监视的文件描述符的最大值加IP
readfds:由select。监视的读文件描述符集合「
wiitefds:由select。监视的写文件描述符集合/
exeptfds:由select。监视的异常处理文件描述符集合
函数传入值,
NULL:永远等待,直到捕捉到信号或文件描述符己准备好为止”
何具体值:structtimeval类型的指针,若等待了timeout时间还没有检测到
timeout“任何文件描符准备好,就立即返回,
0:从不等待,测试所有指定的描述符并立即返回.,
成功:准备好的文件描述符,
函数返回值2
0:超时;-1:出错。
32
select。函数格式(2)
•select函数根据希望进行的文件操作对文件描述符进行了分类处理,
这里,对文件描述符的处理主要涉及到4个宏函数
FD_ZERO(fd_set,lset)p清除一个文件描述符集「
FT)_SET(iiitfd,fdset将一个文件描述符加入文件描述符集中~
FD_CLR(iiitfd,fdset:l:set)*)将一个文件描述符从文件描述符集中清除。
如果文件描述符fd为fdset集中的一个元素,则返回非零值,可以
FD_ISSET(intfd,fdset*set).用于调用select。之后测试文件描述符集中的哪个文件描述符是否
有变化
•一般来说,在使用select。函数之前,首先使用FD_ZERO()和FD_SET()来初
始化文件描述符集,在使用了select。函数时,可循环使用FD_JS§ET()来测试
描述符集,在执行完对相关文件描述符的操作之后,使用FD_CLR()来清除描
述符集。
33
•另外,select函数中的timeout是一个structtimeval类型的指针,
该结构体如下所示:
,structtimeval{
•longtv_sec;/*second*/
•longtv_unsec;/*andmicroseconds*/
•}
•可以看到,这个时间结构住的精确度可以设置到微秒级,这对于
大多数的应用而言已经足似了。
poll。函数格式
#uichide<sy*types.h>“・
所需头文件。
=iiichule'poll.li^
函数原型。iiitpoll(stiiictpollfd:,sfds,intnumfds、iiittimeout"
fds:stmctpollfd结构的指针,用于描述需要对哪些文件的哪种类型的操作进行监控….
structpollfd"
Ulffd:/*需要监听的文件描述符
shoitevents;/*需要监听的事件*/,
shortrevents:/*己发生的事件%
卜
events成员描述需要监听哪些类型的事件,可以用以下几种标志来描述:~
函数传入值”POLLIN:文件中有数据可读,下面实例中使用到了这个标志~
POLLPRI::文件中有紧急数据可读“
POLLOUT:可以向文件写入数据.
POLLERR:文件中出现错误,只限于输出,
POLLHUP:与文件的连接被断开了,只限于输出“
POLLNVAL:文件描述符是不合法的,即它并没有指向一个成功打开的文件。。
munfds:需要监听的文件个数,即第一个参数所指向的数组中的元素数目。
timeout:表示poll阻塞的超时时间(毫秒)。如果该值小于等于0,则表示无限等待。…
成功:返回大于0的值,表示事件发生的pollfd结构的个数。〃•
函数返回值,
0:超时;-1:出错,
35
实验5select多路复用
36
4标准工/o编程
37
标准工/0编程概述
•前面讲述的系统调用是操作系统直接提供的函数接口。因
为运行系统调用时,Linux必须从用户态切换到内核态,执
行相应的请求,然后再返回到用户态,所以应该尽量减少
系统调用的次数,从而提高程序的效率。标准工/。提供流
缓冲的目的是尽可能减少使用read。和wri佗()等系统调用
的数量。标准工/O提供了3种类型的缓冲存储。
•全缓冲:在这种情况下,当填满标准"。缓存后才进行实
际工/O操作。对于存放在磁盘上的文件通常是由标准工/O
库实施全缓冲的。
38
•行缓冲:在这种情况下,当在输入和输出中遇到行结束符时,标
准工/0库执行工/0操作。这允许我们一次输出一个字符(如
fputc()函数),但只有写了一行之后才进行实际工/0操作。标准
输入和标准输出就是使用行缓冲的典型例子。
•不带缓冲:标准工/0库不对字符进行缓冲。如果用标准工/0函数
写若干字符到不带缓冲的流中,则相当于用系统调用wMteO函数
将这些字符全写到被打开的文件上。标准出错stderr通常是不带
缓存的,这就使得出错信息可以尽快显示出来,而不管它们是否
含有一个行结束符。
39
基本操作(1)
•打开文件:
有三个标准函数,分别为:fopen()>fdopen()和
freopenQo它们可以以不同的模式打开,但都返
回一个指向F工LE的指针,该指针指向对应的1/0
流。此后,对文件的读写都是通过这个F工LE指针
所需头文件,wichide<stdio.li>43
函数原型。FILEfopen(constchai*path,constchar1mode)*
Path:包含要打开的文件路径及文件名-
函数传入值/
mode:文件打开状态(后面会具体说明)。
成功:指向FILE的指针,
函数返回值2
失败:NULL,
40
基本操作(2)
其中,mode定义打开文件的访问权限等:
r或山+、打开只读文件,该文件必须存在。
r+或r+b。打开可读写的文件,该文件必须存在e
打开只写文件,若文件存在则文件长度清为0,即会擦写文件以前的内容。若文件不
W或wbp
存在则建立该文件。
打开可读写文件,若文件存在则文件长度清为0,即会擦写文件以前的内容。若文件
\v+或w+b:
不存在则建立该文件。
以附加的方式打开只写文件。若文件不存在,则会建立该文件;如果文件存在,写
a或ab+>
入的数据会被加到文件尾,即文件原先的内容会被保留•
以附加方式打开可读写的文件。若文件不存在,则会建立该文件;如果文件存在,
a+或a+b~
写入的数据会被加到文件尾后,即文件原先的内容会被保留,
基本操作(3)
・关闭文件:
关闭标准流文件的函数为fclose(),该函数将缓
冲区内的数据全部写入到文件中,并释放系统所
提供的文件资源。
所需头文件a箱nch*le<stdio.li>*3
函数原型。uitfcloselFILE4stream)/
函数传入值“stream:己打开的文件指针"
成功:Ox
函数返回值
失败:EOF。
基本操作(4)
•在文件流祓打开夕后,向对文件流讲行
所需头文件,如chide<stdio.h中
函数原型一sizetfiead(Aoidph,size_tsize,size」iunenib,FILE1stream*
pti:存放读入记录的缓冲区。
size:读取的记录大小e
函数传入值。
nmemb:读取的记录数
stream:要读取的文件流。
成功:返回实际读取到的mnemb数目x
函数返回值2
失败:EOFP
43
基本操作(5)
所需头文件,国iclude<stdio.h>^
函数原型。sizetfwrite(constvoid*ptr、size_tsize,sizetnniemb、FILE*stream)*'
Ptl:存放写入记录的缓冲区2
size:写入的记录大小"
函数传入值“i
muemb:写入的记录数。
stream:要写入的文件流2
成功:返回实际写入到的luiiemb数目A
函数返回值
失败:EOF'
示例
•阅读代码并运行示例6-5-1
45
其他操作(1)
所需头文件a施chide<stdio.li>*3
uitpntc(iiitc.FILE*stream)】
函数原型「uitc,FILE*stream),
iiitputchaijmtC)P
成功:字符小
函数返回值。
失败:EOF。
字符输出函数
所需头文件2include<stdio.li>*5
uitgetc(FILE1stream)】
函数原型「uitfgetcfFILE*stream"
uitgetcliar(voi(l)<
函数传入值2stream:要输入的文件流+,
成功:下一个字符।
函数返回值。
失败:EOF*,
46
其他操作(2)
行输入函数
所需头文件。#include<$tdioh>^
chargets(chai*s)i
函数原型,
charfgets(chai1s.intsize.FILE*stream”
8:要输入的字符串1
函数传入值Csize:输入的字符串长度i
stream:对应的文件流“
成功:S,
函数返回值。
失败:NULL,
•行输出函数
所需头文件delude<stdio.h>,)
iiitputs(constchar*S)Ag
函数原型。
mtfputs(coustchar*s,FTT.F*stream*\
8:要输出的字符串,\
函数传入值,sheam:对应的文件流a,
成功:si\
函数返回值“
失败:NULL,J
47
其它操作(3)-格式化输入
所需头文件include<stdio.li><3
intconstchar"format…
函数原型QintfjJiintRFELEconstchai*foimat...)i
uitspiiiitf(chai*buf.constchai:,cfonnat...)P
format:记录输出格式,
函数传入值。fp:文件描述符,
buf:记录输出缓冲区Q
成功:输出字符数(spdntf返回存入数组中的字符数):
函数返回值。
失败:NULL-
强chide<stdaig.li>!
所需头文件,
•chide<stdioh>.
iiit、"printf(constchar1fonnat.va_listarg)J
函数原型“uitAfpiiiitf(FILE*fp,constchar:「formatva_listarg)J
uitvsprintf(char'buf,constchai:,:foiinatva_listarg)^
fonnat:记录输出格式J
函数传入值。fj):文件描述符二
arg:相关命令参数a
成功:存入数组的字符数】
函数返回值
失败:NULL-
48
其它操作(4)-格式化输入
输出(2)
所需头文件2筠include<stdio.h>p'/
intscanf(constchai*fbnnat,...)A,「
函数原型「inffscaiif(HLE"邳、constchar*fbnnat…),i
uitsscaiififchai:hbuf,constchar*format,\
foimat:记录输出格式i、)
函数传入值2m:文件描述符Jr
buf:记录输入缓冲区。Y
成功:输出字符数(spnutf返回存入数组中的字符数)i,1
函数返回值。
失败:NULL.,f
49
6.6实验
50
实验1-文件读写及上锁(1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届北京市房山区市级名校高一物理第一学期期末综合测试模拟试题含解析
- 2024年EMI屏蔽材料项目立项申请报告
- 2024年胶枪热熔胶项目提案报告
- 2024年大屏幕液晶投影电视机项目提案报告
- 【正版授权】 ISO 80369-20:2024 EN Small-bore connectors for liquids and gases in healthcare applications - Part 20: Common test methods
- 2025届河北省张家口市物理高三上期中调研模拟试题含解析
- 2024年车辆修理合同范本
- 2024年厂房转让合同参考样本(4篇)
- 2024年材料买卖合同参考样本(3篇)
- 2024年饭店转让合同经典版(2篇)
- 供应链中心组织架构
- 《机房技术培训》课件
- 装载机操作安全规程培训
- 足疗店应急处理预案模板
- 项目经理的管理思路
- 中药材商品规格等级-款冬花
- 项目一-旅游概述-(旅游概论课件完美版)
- 齐鲁书社五年级传统文化教案第二单元中庸之道
- 消防安全教育培训记录
- 数学小报勾股定理
- 村镇供水工程(农村饮水安全工程)施工质量验收评定表及填表说明
评论
0/150
提交评论