在说IO之前先补充几个常见的命令:
1.od -c:按照字符编码显示文件内容,od -c filename
2.find:在指定路径下查找文件名,find 路径 -name 文件名
3.压缩、解压.tar.bz2文件:
①压缩:tar -jcvf 文件名 .tar.bz2 文件夹 /*
②解压:tar -jxvf 文件名 .tar.bz2
4.du:获得指定目录下文件的大小,du -k文件夹(按照kb获取大小);du -m 文件夹(按照mb获取大小)
5.makefile:
①它是一个工程管理工具
②用户多文件编程中指定代码的编译规则。
③使用方法是进入到工程目录中,输入make,注意要有makefilen文件
这样就可以把 你想要的文件在这里面用命令关联起来,想要编译的时候只需要输入make就编译了。
一、标准IO
1.fputc函数:int fputc(int c, FILE *steam);这个函数是用来向文件中写入一个字符,成功返回写入字符的ASCII码值,失败返回EOF(-1)
2.fgetc函数:int fgetc(FILE *steam);这个函数是用来从文件中读取一个字符,成功返回写入字符的ASCII码值,失败返回EOF(-1)
3.fopen函数:FILE *fopen(const char *pathname, const char *mode);这个函数是用来打开一个文件获得文件流指针,第一个参数是路径,第二个是打开方式。打开方式又分为只读打开‘r', 读写打开‘r+’,只写‘w’, 还有写读‘w+’,写会默认覆盖掉之前的内容,追加只写打开‘a’,追加读写打开‘a+’。这个函数成功返回文件流指针,失败返回NULL。
4.fclose函数:int fclose(FILE *steam);这个函数是将文件流指针关闭,成功返回0,失败返回EOF。
5.fgets函数:char *fgets(char *s, int size, FILE *stream);这个函数是从文件中读取一段字符(遇到\n会立即停止),成功返回存放字符串空间的首地址,失败或读到文件末尾返回NULL。
6.fputs函数:int fputs(const char *s, FILE *stream);这个函数是将字符串写入到文件中,成功返回非负数,失败返回EOF。
7.fread函数:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *steam);这个函数是从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中,成功返回实际读到对象的个数,失败返回,读到文件末尾返回0。
8.fwrite函数:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *steam);这个函数是向文件中写入nmemb个对象,每个对象size个字节,存放到ptr指向的空间中,成功返回实际读到对象的个数。
9.fseek函数:int fseek(FILE *stream, long offset, int whence);这个函数是用来设置流的偏移量的,成功返回0,失败返回-1。offset是偏移量,大于0向后偏移,小于0向前偏移。whence:系统默认宏里面定义的。SEEK_SET 文件开头;SEEK_END 文件末尾;SEEK_CUR 当前位置。
10.rewind函数:void rewind(FILE *stream);将流重定位到开头
11.ftell函数:long ftell(FILE *stream);获取流当前的偏移量。
12.fscanf函数:int fscanf(FILE *stream, const char *format, ...);这个函数是格式化获取文件内容的,成功返回读取的数据,出错或者到结尾返回EOF。
13.fprintf函数:int fprintf(FILE *stream, const char *format, ...);这个函数是格式化写入文件内容的。
14.特殊的流:①stdin:标准输入流 ②stdout:标准输出流 ③stderr:出错流。
二、文件IO
1.操作方式:
1.打开文件 open
2.读写文件 read/write
3.关闭文件 close
2.man手册章节:
1.标准命令
2.系统调用
3.库函数
4.设备说明
5.文件格式
6.娱乐
7.杂项
8.管理员命令
3.函数接口使用:
man 2 open
1.open
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:
打开文件获得操作文件的文件描述符(很小、非负整数)
参数:
pathname:要打开文件的路径
flags:打开的方式
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_APPEND 追加
O_ASYNC 异步IO
O_CREAT 创建
O_EXCL 检测文件是否存在
O_NONBLOCK 非阻塞IO
O_TRUNC 截断(清0)
返回值:
成功返回文件描述符
失败返回-1
文件描述符范围: 0 - 1023
0: stdin 标准输入
1: stdout 标准输出
2: stderr 标准出错
文件描述符产生规律:
1.范围 0 - 1023
2.总是取尚未被占用的最小的非负整数
rwx rwx rwx
110 100 100
6 4 4
使用文件IO来实现标准IO打开文件的特性
"r" -> O_RDONLY
"r+" -> O_RDWR
"w" -> O_WRONLY | O_CREAT | O_TRUNC, 0664
"w+" -> O_RDWR | O_CREAT | O_TRUNC, 0664
"a" -> O_WRONLY | O_CREAT | O_APPEND, 0664
"a+" -> O_RDWR | O_CREAT | O_APPEND, 0664
2.close
int close(int fd);
功能:
关闭文件描述符
3.write
ssize_t write(int fd, const void *buf, size_t count);
功能:
向文件中写入数据
参数:
fd:文件描述符
buf:写入数据存放的空间首地址
count:实际写入字节数
返回值:
成功返回实际写入字节数
失败返回-1
4.read
ssize_t read(int fd, void *buf, size_t count);
功能:
从文件中读取数据
参数:
fd:文件描述符
buf:存放数据空间首地址
count:想要读取的数据字节数
返回值:
成功返回实际读取字节数
失败返回-1
读到文件末尾返回0
三、标准IO与文件IO的区别:
1.系统调用:
Linux内核中的代码称为系统调用
2.库函数:
是针对操作系统内核中代码的封装
3.标准IO与文件IO的区别:
1.标准IO是库函数,在Linux和Windows平台均能使用
2.文件IO是系统调用,只有在Linux内核平台中才能使用
3.标准IO是一种有缓存的IO
4.文件IO是没有缓存的IO
4.标准IO应用场景:
1.主要用来操作普通文件
5.文件IO应用场景:
1 .主要用来操作设备文件以及除普通文件外其余类型的文件
6.标准IO缓存
标准IO中的函数接口将数据放入缓存区中,满足刷新条件交给内核
缓存分类:
1.全缓存:
缓存区满,刷新缓存区 与文件建立的缓存一般都为全缓存
刷新条件:
1.存满4k刷新
2.程序结束刷新(fclose刷新)
3.fflush函数强制刷新
2.行缓存: 与终端建立的缓存一般为行缓存 stdin stdout
遇到\n刷新
刷新条件:
1.遇到\n刷新
2.存满1k刷新
3.程序结束刷新(fclose刷新)
4.fflush函数强制刷新
3.不缓存: 人机交互、界面控制、出错处理 stderr
直接刷新
刷新条件:
1.直接刷新