华清远见实训day2

一、函数

一个完成特定功能的代码模块,可能有返回值,也可能没有

1.函数的封装

        <数据类型>函数名(形式参数) 

{

        功能代码模块;

        return 表达式;

}

 //数据类型跟函数返回值的数据类型一致,如果没有返回值,写void;

函数名一般和功能相关;

形式参数:告诉调用者,在使用函数时需要传入参数的个数、类型、顺序;

return :返回值,表示函数的结果,若没有返回值,可以选择不填或直接填return

2.函数的声明

华清远见实训day2_第1张图片

3.函数的调用

        函数名(实际参数);    //实参的个数、类型、顺序必须和形参一致

练习:封装一个函数,实现两个数的交换

 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 }

二、文件io

1.open()

函数原型: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");
                

华清远见实训day2_第2张图片

小练习:随便打开一个文件,有则打开,无则创建。 

 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:文件描述符 

运行结果:

 华清远见实训day2_第3张图片

2.close()

    --------------------------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 }

3.read()

    --------------------------read()-----------------------------

华清远见实训day2_第4张图片

 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 }

测试一下: 

华清远见实训day2_第5张图片 

 (PS:只读前五个)

 ret:真正读到的字节数

 buf:缓冲区(存放字符的地方)

4.write()

    --------------------------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()


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的文件描述符 

 今日作业:复习、预习

你可能感兴趣的:(嵌入式开发,linux,vim,c语言)