高级编程学习笔记day02(知识点篇)
标准IO学习笔记
1. 流: 当用标准I/O库打开一个文件时, 一个流就与一个文件相关联.
2. 对一个进程预定义了3个流,这三个流可以自动的被进程使用, 分别是: 标准输入, 标准输出, 标准错误(stdin, stdout, stderr).
3. 缓冲
(1): 引入缓冲是为了减少read和write调用的次数,同时对每个I/O流自动的进行缓冲管理.
(2): 标准I/O提供了三种缓冲
行缓冲:stdin, stdout
无缓冲:stderr
全缓冲:其余大部分都是全缓冲的
(3): 缓冲区刷新:调用fflush(3)函数, 调用fclose(3)函数, main到return
4. 打开流
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
note: (1) fopen函数打开路径名为path的指定文件
(2) fdopen函数通过文件描述符打开文件,
(3) mode参数: r 只读打开, 流位于文件的开头.
r+ 读写打开, 流位于文件开头.
w 将文件截断为零长度或创建用于编写的文本文件, 流位于文件的开头.
w+ 读写打开, 如果文件不存在, 创建该文件, 否则截断该文件, 流位于文件的开头.
a 以在文件末尾追加内容的方式打开, 如果文件不存在则创建, 流位于文件的末尾.
a+ 以读或在文件末尾追加的方式打开, 若果不存在则创建, 用于读取的初始文件位置位于文件的开头, 但是输出总是附加到file的末尾.
(4) 在指定w或a类型创建一个新文件时, 我们无法说明该文件的访问权限.
4. 基本I/O操作函数
按字节读写:
r: getchar(3) fgetc(3) getc(3)
w: putchar(3) fputc(3) putc(3)
按行读写:
r: gets(3)(不用) fgets(3)
w: puts(3) fputs(3)
按结构读写:
r: fread(3)
w: fwrite(3)
按格式花读写:
r: scanf(3) fscanf(3)
w: printf(3) fprintf(3)
5. 定位流
fseek: int fseek(FILE *fp, long offset, int whence);
ftell: long ftell(FILE *fp);
rewind: void rewind(FILE *fp);
note: (1) whence 的值和lseek函数的相同
6. fdopen(3) 通过文件描述符得到流
fileno(3) 通过流得到文件描述符
7. getline(3)
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
note: (1) 从流中读取整行存储到*lineptr, 缓冲区以NULL结尾, 如果找到换行符, 则包含换行符.
8. feof(3), ferror(3)
note: (1) 函数feof()测试由流指向的流的文件结束指示器, 如果设置为非0, 则返回非0. 文件指示器只能由函数clearerr()清除.
(2) 函数ferror()测试由流指向的流的错误指示器, 如果设置为非0, 则返回非0, 错误指示器同样只能由clearerr()函数设置.
9. 关闭流
int fclose(FILE *fp);
note: (1) 在文件被关闭之前, 冲洗缓冲中的输出数据.
(2) 如果标准I/O库已经为该流自动分配了一个缓冲区, 则释放此缓冲区.