作业分析讲解
================
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. 复杂点:能写多少是多少 文件夹中嵌套多个文件夹,封装一个递归函数把所有的目录项全部读取出来(包括子目录里面),并打印文件名(文件名要求完整的路径名)