I/O
man 1 命令
man 2 系统调用 内核给用户留出的接口
man 3 库 以二进制形式存在的函数集合
文件类型 :
- -普通文件 ( 二进制、ASCII )
- p 管道
- d 目录
- s 套接字
- l 链接
- c 字符设备
- b 块设备
Input:
- 输入:数据由内核空间流向用户空间
流:
- 用来表示数据的方向
- 标准IO中 系统预定义的3个流:
- stdin标准输入
- stdout标准输出
- stderr标准错误
标准IO缓冲区:
- 全缓存:操作文件,大小4k,刷新fflush
- 行缓存:操作终端(stdin、stdout),大小1024字节,遇到\n刷新
- 不缓存:stderr
* FILE * 流指针 是一个结构体,用来描述文件
* 文件指针:一个long型表示文件的位置
* perror();打印最后一次系统错误信息
标准IO操作文件的方式:
- feof用来判断是否到达文件末尾,到达文件末尾返回非零值。
函数:
fopen :
- fopen(path,mode);成功返回FILE *,错误返回NULL并且设置errno。
- mode:
- r:只读,文件指针指向文件开头,如果文件不存在则报错。
- r+:读写,文件指针指向文件开头,如果文件不存在则报错。
- w:清空,只写,文件不存在则创建,文件指针指向文件开头
- a:追加,只写到末尾,文件不存在则创建,文件指针指向文件末尾。
- a+:追加,读写,写到末尾,文件不存在则创建,初始时读文件指针指向开头。
- 操作二进制文件:rb,rb+,ab+
fclose :
- 关闭流
- fclose(FILE *);
- 不要多次关闭同一个流
fprintf :
- 同printf
- (FILE * , 后同printf );
fseek :
- 通过fseek对文件指针进行操作
- fseek(FILE *,offset,whence);
- offset:+表示向后偏,-值表示向前偏
- whence:
- SEEK_SET文件头
- SEEK_CUR当前位置
- SEEK_END文件末尾
- ftell告知当前指针位置
- rewind偏移指针到头。
按字符
- fgetc/getc
- fputc/putc
按行
-
fgets(char *s,size,FILE *)
; 读取size-1个字符存放到s里,最后一个位置存放\0 , fgets 遇到 EOF 或者 \n 会停止。 -
fputs(char *s,FILE *)
;
按块
-
fread(void *,size,nmemb,FILE *)
; 返回值为成功读取的对象的个数,操作ASCII码文件是尽量使用char *。注意返回值对fwrite操作的影响。 - fwrite同上。
* 不建议使用的函数gets
* 操作文件时,遇到全缓存要注意使用fflush刷新。
追踪代码:
- ctags追踪代码 vim -t 变量/类型
- 选择合适的代码之后继续追踪,光标移动,ctrl+]
- vim -t需要安装ctags
- 解压内核 tar -vxf 压缩文件
- 切换到内核目录下ctags -R 生成tags文件
- 配置~/.vimrc 加入一行 set tags+=tags路径