一个完成特定功能的代码模块,可能有返回值,也可能没有
<数据类型>函数名(形式参数)
{
功能代码模块;
return 表达式;
}
//数据类型跟函数返回值的数据类型一致,如果没有返回值,写void;
函数名一般和功能相关;
形式参数:告诉调用者,在使用函数时需要传入参数的个数、类型、顺序;
return :返回值,表示函数的结果,若没有返回值,可以选择不填或直接填return
函数名(实际参数); //实参的个数、类型、顺序必须和形参一致
练习:封装一个函数,实现两个数的交换
12 #include
13 #include
14 #include
15 #include
16
17 int exchange(int *x,int *y)
18 {
19 int t = *x;
20 *x=*y;
21 *y=t;
22 return 0;
23 }
24
25 int main()
26 {
27 int a=99;
28 int b=1;
29 printf("原:a=%d,b=%d\n",a,b);
30 exchange(&a,&b);
31 printf("现: a=%d,b=%d\n",a,b);
32 return 0;
33 }
函数原型:int open(char *pathname,int flags,mode_t mode);
函数功能:打开或新建一个文件
参数:
pathname ----被打开的文件名( 可包含路径,没加文件路径表示在当前目录)
flags ----O_RDONLY:只读方式打开
----O_RDWR:读写方式打开 //前三个参数必须选择一个进行填写
----O_CREAT:如果该文件不存在,就新创建一个文件,并用第三个参数为其设置权限
----O_EXCL: 如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在
//O_NOCTTY: 使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
O_TRUNC: 如文件已经存在, 那么打开文件时先删除文件中原有数据
O_APPEND: 以添加方式打开文件,所以对文件的写操作都在文件的末尾进行
mode -- 被打开文件的存取权限
0标识这个数是8进制
三个8进制数 1、文件拥有者读写权限 2、拥有着同组用户读写权限 3、其他用户读写权限
返回值: 调用成功返回文件描述符,失败返回-1并设置errno;// perror("open");
小练习:随便打开一个文件,有则打开,无则创建。
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 int main(int argc ,char *argv[])
20 {
21 int fd = open("1.txt",O_RDONLY|O_CREAT,0664);
22 if(fd < 0)
23 {
24 //printf("open 1.txt error\n");
25 perror("open 1.txt");
26 return -1;
27
28 }
29 printf("open success! fd = %d\n",fd);
30 return 0;
31 }
fd:文件描述符
运行结果:
--------------------------close()-----------------------------
函数原型: int close(int fildes);
函数功能: 关闭一个已经打开的文件
参数: fildes -- 要关闭文件的文件描述符
返回值: 调用成功返回0,出错返回-1,并设置errno;
当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
关闭一个文件的同时,也释放该进程加在该文件上的所有记录锁;
例子:
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 int main(int argc ,char *argv[])
20 {
21 int fd = open("1.txt",O_RDONLY|O_CREAT,0664);
22 if(fd < 0)
23 {
24 //printf("open 1.txt error\n");
25 perror("open 1.txt");
26 return -1;
27
28 }
29 printf("open success! fd = %d\n",fd);
30 close(fd);
31 return 0;
32 }
--------------------------read()-----------------------------
read()函数小练习 :读1.txt的前5个字符(内容随便写的)
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 int main(int argc, char argv[])
20 {
21 int fd = open("1.txt",O_RDONLY,0664);
22 if(fd < 0)
23 {
24 perror("open 1.txt");
25 return -1;
26 }
27 char buf[64] = {0};
28 int ret = read(fd,buf,5);
29 if(ret < 0)
30 {
31 perror("read");
32 return -1;
33 }
34 printf("read %d bytes:%s\n",ret,buf);
35 return 0;
36 }
测试一下:
(PS:只读前五个)
ret:真正读到的字节数
buf:缓冲区(存放字符的地方)
--------------------------write()-----------------------------
函数原型: ssize_t write(int fd, const void *buf, size_t count);
函数功能: 向一个已经打开的可写文件中写入数据
参数: fd -- 文件描述符
buf -- 指定的缓冲区,指向一段内存单元
count -- 请求写入的字节数
返回值:
write调用成功返回写入的字节数,返回-1.表示出错,通过errno设置错误码;
write()的返回值通常与count不同,因此需要循环将全部待写的数据全部写入文件;
练习一下:写一个2.txt
目录
一、函数
1.函数的封装
2.函数的声明
3.函数的调用
二、文件io
1.open()
2.close()
3.read()
4.write()
5.lseek()
--------------------------lseek()-----------------------------
函数原型: off_t lseek(int fd, off_t offset, int whence);
函数功能: 定位一个已经打开的文件;
参数:
fd -- 文件描述符
offset -- 偏移量,每一读写操作所需要移动的距离, 单位是字节的数量,可正可负(向前移,向后移)
whence(当前位置基点) -- SEEK_SET:当前位置为文件的开头,新的位置为偏移量的大小。
SEEK_CUR:当前位置为文件指针的位置, 新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
返回值:
调用成功时,返回当前相对与文件开头的偏移量,以字节为单位
调用失败时返回-1,并修改errno的值;
练习:文件io实现文件复制(copy.c)
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 int main(int argc,char *argv[])
20 {
21 int fd1 = open("1.txt",O_RDONLY,0664);
22 if(fd1 < 0)
23 {
24 perror("open 1.txt");
25 return -1;
26 }
27 int fd2 = open("2.txt",O_WRONLY|O_CREAT,0664);
28 if( fd2 < 0)
29 {
30 perror("open 2.txt");
31 return -1;
32 }
33 int ret = 0;
34 char buf[64] = {0};
35
36 while((ret = read(fd1,buf,64))>0)
37 {
38 write(fd2,buf,ret);
39 }
40 return 0;
41 }
fd1:文件1.txt的文件描述符 ;fd2:文件2.txt的文件描述符
今日作业:复习、预习