文件IO(四)

作业分析讲解,复习
=======================
   1.   常见的排序算法,网上搜,理解并能写出代码


内存映射
==========
  1.  目前写的显示图像的代码--》write写入像素点到lcd中(效率低)
  2.  内存映射--》得到硬件设备的地址(可以模仿单片机操作,直接往硬件地址中赋值即可)
      #include <sys/mman.h>
      void *mmap(void *addr, size_t length, int prot, int flags,  int fd, off_t offset);
               返回值:成功   映射得到的硬件设备的首地址    失败    NULL 
                   参数:addr ---》一般设置为NULL,表示由操作系统自动给我分配硬件的首地址
                              length ---》你打算映射多大的内存空间,字节
                              prot ---》设置映射的内存区域读写的权限
                                              PROT_READ    //可读
                                              PROT_WRITE  //可写
                             flags ---》设置映射的内存区域能否被共享
                                               MAP_SHARED   //可以共享
                                               MAP_PRIVATE   //不共享
                             fd ---》你要映射的硬件设备的文件描述符
                             offset ---》一般设置为0
       int munmap(void *addr, size_t length);  //解除映射
                 参数:addr ---》你刚才映射得到的硬件首地址
                            length ---》你映射得到的地址大小


标准IO
=======================================
区别系统IO和标准IO
        区别一:  系统IO用文件描述符来表示不同的文件
                        标准IO用FILE指针表示不同的文件
1. 相关的接口函数
     (1)文件的打开
             FILE *fopen(const char *path, const char *mode);
                    返回值:成功返回FILE指针指向打开的文件     失败  -1
                       参数:path --》你要打开的文件路径名
                                  mode --》r(以只读的方式打开文件)         r+ (可读写)      w (只写,文件不存在就新建,存在就清空覆盖)    w+(可读写,文件不存在就新建,存在就覆盖)      a (只写,文件不存在就新建,存在就直接打开 )   a+(可读写,文件不存在就新建,存在就直接打开)
     (2) 文件的读写
            size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
                    按数据块读取数据     read(fd, buf,100)     fread(buf,2,50);
                    返回值:成功返回读取到完整的数据块个数     失败   -1
                        参数: ptr --》保存读取的内容
                                 size --》每个数据块的大小
                                 nmemb --》你打算读取几个数据块
                                 stream --》 你要读取的那个文件           
            size_t fwrite(const void *ptr, size_t size, size_t nmemb,  FILE *stream);
                    返回值:nmemb参数是多少,返回值就是多少,根本不考虑ptr参数中数据是否足够
                                参见例子

    (3)  文件的关闭
           int fclose(FILE *stream);
    (4)  perror()和linux中错误码
           作用:详细分析linux中函数错误的具体原因
                     比如: 打开文件失败的原因??
                                   文件不存在,名字写错了
                                   权限不够
          #include <errno.h>
           void perror(const char *s);
                  参数:s  ---》打印字符串
           原理:linux内核中把所有linux中支持的函数能够出现的错误定义成了宏定义
                    把各种出错的原因用数字编了号(这些数字称之为错误码)
                    linux定义了全局变量  int  errno用来保存错误码(一旦函数出错了,系统会自动更新errno的值)
                      #define     文件不存在   1
                      #define     权限不够      2
                      #define   文件名字太长  3
         常见错误码:
    #define EPERM            1      /* Operation not permitted */
      #define ENOENT          2      /* No such file or directory */
      #define ESRCH            3      /* No such process */
      #define EINTR            4      /* Interrupted system call */
      #define EIO                5      /* I/O error */
      #define ENXIO            6      /* No such device or address */
      #define E2BIG            7      /* Argument list too long */
      #define ENOEXEC          8      /* Exec format error */
      #define EBADF            9      /* Bad file number */
      #define ECHILD          10      /* No child processes */
      #define EAGAIN          11      /* Try again */                                                                                  
      #define ENOMEM          12      /* Out of memory */
      #define EACCES          13      /* Permission denied */
      #define EFAULT          14      /* Bad address */
      #define ENOTBLK         15      /* Block device required */
      #define EBUSY           16      /* Device or resource busy */
      #define EEXIST          17      /* File exists */
      #define EXDEV           18      /* Cross-device link */
      #define ENODEV          19      /* No such device */
      #define ENOTDIR         20      /* Not a directory */
      #define EISDIR          21      /* Is a directory */

       

    (5)   fgets()   fputs()     fgetc()   fputc()
                 int fgetc(FILE *stream);  //从stream指向的文件中读取一个字节的数据
                            按字符读取
                            返回值:读取的那个字符的ASCII码值
                 int fputc(int c, FILE *stream);
                            把c对应的字符写入到stream指向的文件中

                 char *fgets(char *s, int size, FILE *stream); //从stream指向的文件中读取size字节的数据,存放到指针s中
                           按行读取
                           返回值: 读取到的数据的首地址
                int fputs(const char *s, FILE *stream);
                           把s对应的字符串写入到stream指向的文件中

                int getc(FILE *stream);   //从stream指向的文件中读取一个字节的数据
                int putc(int c, FILE *stream);  
                           把c对应的字符写入到stream指向的文件中
       

       

   
练习:    
        1.  自己研究fwrite规律是否跟fread一样(返回值 )
             a和a+的使用
        2.  用fread和fwrite实现拷贝文件
                         总结: 拷贝文件无非两种思路  
                                          思路一:一口气读写文件,不用循环  (只适合拷贝小文件)
                                          思路二:分段拷贝文件,分段读写,用循环(大小文件都行)

作业:
       1.  查询并理解常用的排序算法   快速排序    堆排序    选择排序    
                                                    二分查找 
       2. open  read  write
              失败: 文件不存在    通过错误码errno去判断出错的原因并处理 
                        权限不够
           fd=open()
           if(fd==-1)  
           {
                  if(errno==???)  //查询错误原因,补救

           }
       3.  使用fgetc和fputc配合实现文件读写拷贝
                  fgets和fputs配合实现文件读写拷贝
       


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值