目录
概要
标准IO
1.概念:
2.特点:
3.缓存区
3.1行缓存:和终端操作相关
3.2全缓存:和文件操作相关
3.3不缓存:标准错误 stderr
4.函数
4.1打开文件
4.2关闭文件
4.3读写文件
4.3.1每次一个字符的读写
fgetc
fputc
4.3.2每次一个字符串的读写
fgets
fputs
4.3.3二进制读写文件
fread
fwrite
4.4文件定位操作
rewind
fseek
ftell
概要
IO:
标准IO
文件IO
文件属性获取
目录操作
库:静态库、动态库
进程:
进程
线程
进程间的通信:7种 6
面向应用,学习大量函数 70左右,功能、参数、返回值,man手册
标准IO
文件类型
b s p -(普通文件) l c d
1.概念:
在C库中定义的一组用于输入输出的函数
2.特点:
- 有缓存区(缓冲机制),通过缓冲机制减少系统调用的次数,提高效率
补充:系统调用:内核向上提供的一组接口
- 围绕流进行操作,流用FILE*来描述,FILE代表的是结构体,描述所操作文件的信息
- 默认打开了三个流:stdin(标准输入)、stdout(标准输出)、stderr(标准错误)
补充:sudo ctags -R的使用(可以追代码)
vi -t FILE(typedef定义数据类型、宏定义、结构体等)
选择合适的编号
将光标定位在目标位置,ctrl+] :向下追代码
ctrl+t:回退
q:退出
3.缓存区
3.1行缓存:和终端操作相关
刷新缓存的条件:
- 程序正常退出
- \n刷新
- 缓存区满
除了这种验证缓存区大小之外还有其他的验证方式
4.强制刷新 fflush
3.2全缓存:和文件操作相关
刷新缓存条件:
- 程序正常退出
- 缓存区满刷新
- 强制刷新 fflush
3.3不缓存:标准错误 stderr
4.函数
4.1打开文件
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
参数:path:打开文件mode:打开方式r:只读,流被定位到文件开头r+:可读可写,流被定位到文件开头w:只写,文件不存在创建,文件存在清空,流被定位到文件开头w+:可读可写,文件不存在创建,文件存在清空,流被定位到文件开头a:追加,文件不存在创建存在追加,流被定位到文件末尾a+:可读可写,文件不存在创建,存在追加,开始进行读时从头读,进行写时流被定位到文件末尾
返回值:成功:文件流失败:NULL,并且设置errno(错误码)
示例:
4.2关闭文件
#include<stdio.h>
int fclose(FILE* stream);
功能:关闭文件
参数:stream:文件流
示例:
4.3读写文件
4.3.1每次一个字符的读写
fgetc
#include <stdio.h>
int fgetc(FILE *stream);
功能:从文件中读一个字符
参数:stream:文件流
返回值:成功:读到字符失败或读到文件末尾:EOF(-1)
示例:
补充:
#include <stdio.h>
int ferror(FILE *stream);
功能:判断读文件时是否出错
返回值:非0表示出错int feof(FILE *stream);
功能:判断读文件时是否到文件末尾
返回值:非0表示读到文件末尾
示例:
fputc
#include <stdio.h>
int fputc(int c, FILE * stream)
功能:向文件中写入一个字符
参数:c:要写的字符stream:文件流
返回值:成功:写的字符的ASCII失败:EOF
示例:
4.3.2每次一个字符串的读写
fgets
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取一串字符
参数:s:存放读取的字符串的首地址size:读取的大小stream:文件流
返回值:成功:读取的字符串的首地址失败或读到文件末尾:NULL特性:1.一次调用最多读取一行数据2.实际读到个数为size-1个,末尾自动添加\0
示例:
fputs
#include <stdio.h>
int fputs(const char *s, FILE *stream);
功能:向文件中写字符串
参数:s:要写的内容stream:文件流
返回值:成功:非负整数失败:EOF
4.3.3二进制读写文件
可以读写任意类型的数据,以二进制的方式进行读写
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件流读取多个元素
参数: ptr :用来存放读取元素 (可以用来读取任意类型的数据)size :元素大小 sizeof(数据类型)nmemb :读取对象的个数stream :要读取的文件
返回值:成功:读取对象的个数读到文件尾或失败:0
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:按对象写
参数:同上
返回值:成功:写的元素个数失败 :0
示例:
练习:编程实现cat命令功能。
cat 文件名
思路:打开文件,循环读文件,当读到文件末尾时循环结束,打印读到的数据,关闭文件
练习:编程实现wc -l命令的功能
wc -l 文件名:显示文件的行数
思路:打开文件,循环读文件,当读到文件末尾时循环结束,在循环中判断是否是一行,如果是则对整型变量进行自加,关闭文件。
4.4文件定位操作
rewind
void rewind(FILE *stream);
功能:将文件位置指针定位到起始位置
fseek
int fseek(FILE *stream, long offset, int whence);
功能:文件的定位操作
参数:stream:文件流offset:偏移量:正数表示向后文件尾部偏移,负数表示向文件开头偏移whence:相对位置:SEEK_SET:相对于文件开头SEEK_CUR:相对于文件当前位置SEEK_END:相对于文件末尾
返回值:成功:0失败:-1
示例:
fseek(fp, 10, SEEK_SET);
fputc('a', fp);
(前面显示的是一个占位的作用,并没有实际的数据)
fseek(fp, -5, SEEK_CUR);
fputc('b', fp);
ftell
long ftell(FILE *stream);
功能:获取位置指针当前的文件位置
参数:要检测的文件流
返回值:成功:当前的文件位置,出错:-1
补充: