文件IO(五)

 作业分析讲解
================
   1.  检测文件末尾   end of file --》EOF
          int feof(FILE *stream);  原理:每个文件都有一个结束标记(字符串也有结束标记\0),linux中就用EOF表示文件的结束标记
                 返回值: 到达末尾  返回非零
                               没有到达   返回0

总结fgets和fputs
==================
     1.  fgets读取完整第一行,会把回车一起读取
          fgets(buf, 字节数,指针); 一次最多读取一行  //字节数>=一行的大小   fgets读取完整的一行
                                                                              字节数<一行的大小     fgets读取你写的字节数
         
          fgets(buf,10,stdin);   // 获取键盘输入的字符串保存到buf中    类似于 scanf("%s",buf);
          fputs(buf,stdout);   //把buf中的内容在lcd上打印
          fgetc(stdin);  //从键盘读取一个字符     scanf("%c",&a);
          fputc('@',stdout);  //把字符'@'打印   
     2.   系统IO中用文件描述符来表示文件                             标准IO用FILE指针来表示文件   
                    0      STDFILENO_IN                                                         stdin
                    1      STDFILENO_OUT                                                      stdout
                    2      STDFILENO_ERR                                                       stderr

fseek和ftell和rewind
====================
    (1)移动读写偏移
               int fseek(FILE *stream, long offset, int whence);  //跟lseek是一样,只是第一个参数FILE*
                         注意:fseek的返回值含义跟lseek是不一样的
                                  fseek成功   返回0
                                          失败   返回-1
              long ftell(FILE *stream);  //弥补fseek返回值的"缺陷"
                         返回值:文件当前位置距离起始位置的字节数
              void rewind(FILE *stream);   //等价于   fseek(stream, 0L, SEEK_SET)   //  0L   L表示长整型


练习:
       消化内容,自动动手写一下fgets(buf,10,stdin);

fscanf和fprintf(sscanf和sprintf)
====================
        总结一下:
                 类似于写功能(输入)的函数
                          putc()  fputc()   puts()  fputs()    fprintf()
                 类似于读功能(输出)的函数
                          getc()  fgetc()   gets()  fgets()    fscanf()
        int fscanf(FILE *stream, const char *format, ...);
                    把stream指向的文件里面的内容读取出来,然后按照格式保存到对应的变量中(参见例子代码)
        int fprintf(FILE *stream, const char *format, ...);
                    按照格式format把不同类型的变量拼接之后,写入到stream指向的文件中  
              举例: fprintf(stdout, "%s%d","中国是这一年成立的",1949);  //把字符串和整数合并然后在屏幕上打印


标准IO(带缓冲区)和系统IO(不带缓冲区)的区别
===================
    区别1:最大的区别,  标准IO(带缓冲区)和系统IO(不带缓冲区)
                    fwrite把内容先存放到缓冲区,等到缓冲区满了或者程序退出了(return)会自动刷新缓冲区(把缓冲区里面的内容写入到对应文件中)
               int fflush(FILE *stream);  //刷新缓冲区
    区别2:标准IO本质上是把系统IO作了二次封装(标准IO的源码中也是调用了系统IO的函数)
              

linux中目录操作
==============================
    1.相关的接口函数
       (1) 打开目录
              #include <sys/types.h>
              #include <dirent.h>
                    DIR *opendir(const char *name);
                               返回值:成功返回DIR指针指向你打开的目录     失败 NULL
                                  参数: name --》目录的路径名
       (2) 读取目录中内容(重点)
               struct dirent *readdir(DIR *dirp);
                              返回值: struct dirent
                                            struct dirent {
                                                    ino_t          d_ino;     目录项的编号
                                                    off_t          d_off;       目录项之间的偏移
                                                    unsigned short d_reclen;   大小
                                                    unsigned char  d_type;       //文件类型,linux中有七种类型的文件
                                                                     DT_BLK      块设备
                                                                     DT_CHR     字符设备
                                                                     DT_DIR      目录
                                                                     DT_FIFO     管道
                                                                     DT_LNK      软链接
                                                                     DT_REG      普通文件
                                                                     DT_SOCK     套接字
                                                                     DT_UNKNOWN     不支持的文件类型
                                                    char           d_name[256];   //某个目录项的名字
                                             };

                                 参数:  dirp  --》指向你打开的那个目录
        (3) 关闭目录
                  int closedir(DIR *dirp);
        (4) 新建空白的目录
                 int mkdir(const char *path, mode_t mode);
                          参数:path --》你要新建的目录路径名
                                    mode --》权限   0777  
                           注意:新建目录是无法嵌套新建多个子目录
       (5)  切换目录
               int chdir(const char *path);  //类似cd命令
                          注意:切换目录的时候,命令行中显示的路径是没有改变

练习:
          主函数传参传递一个路径名,先判断是目录还是普通文件(stat??),如果是目录,你就循环读取这个目录中的所有文件,打印名字和类型
                                                                                                          如果是普通文件,你就不理会
 


作业:
         1. 简单点:   打开ubuntu上任意一个文件夹,把里面所有的.bmp找出来,并显示在模拟的液晶屏上
         2. 复杂点:能写多少是多少  文件夹中嵌套多个文件夹,封装一个递归函数把所有的目录项全部读取出来(包括子目录里面),并打印文件名(文件名要求完整的路径名)
                                       


   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值