标准I/O及缓冲区
标准I/O及缓冲区
Linux下一切皆文件,
全缓冲:当流的缓冲区无数据或无空间时才执行实际的 I/O 操作
行缓冲:当输入和输出中遇到换行符(’ \n ‘)时,进行I/O 操作,当流和一个终端关联时,典型的行缓冲
无缓冲:数据直接写入文件,流不进行缓冲
标准I/O预定义的3个流,程序运行时自动打开
流名称 | 描述符值 | 描述符 | 结构体名称 |
---|---|---|---|
标准输入流 | 0 | STDIN_FILENO | stdin(默认行缓冲) |
标准输出流 | 1 | STDOUT_FILENO | stdout(默认行缓冲) |
标准错误流 | 2 | STDERR_FILENO | stderr |
缓冲区的大小为1kb,即1024个字节
文件的打开和关闭
1 | FILE *fopen(const char *path, const char *mode); |
- path为文件路径
- mode为打开方式
- 成功时发回FILE类型流指针,失败时返回NULL
模式参数 | 说明 |
---|---|
“r” 或 “rb” | 以只读的方式打开文件或二进制文件,文件必须存在 |
“r+” 或 “r+b” | 以读写的方式打开文件或二进制文件,文件必须存在 |
“w” 或 “wb” | 以只写的方式打开文件或二进制文件,文件存在时会清空文件内容,文件不存在则创建 |
“w+” 或 “w+b” | 以读写的方式打开文件或二进制文件,文件存在时会清空文件内容,文件不存在则创建 |
“a” 或 “ab” | 以只写的方式打开文件,文件存在数据写入文件末尾,文件不存在则创建 |
“a+” 或 “a+b” | 以读写的方式打开文件,文件存在数据写入文件末尾,文件不存在则创建 |
处理错误信息
1 | void perror(const char *s); |
- errno:存放错误号,由系统生成
- perror:先输入字符串s,再输出错误号对应的错误信息
- strerror:根据错误号返回对应的错误信息
文件的关闭
1 | int fclose(FILE *stream); |
- fclose()调用成功返回0,失败返回EOF,并设置errno
- 流关闭时自动刷新缓冲中的数据并释放缓冲区
- 当一个程序正常终止时,所有打开的流都会被关闭
- 流一旦关闭后就不能执行任何操作
读写流函数
函数 | 参数说明 |
---|---|
int fgetc(FILE *stream) | stream:文件流类型指针 返回值:成功时返回所读字符,遇到文件末尾或出错返回EOF(-1) |
int getc(FILE *stream) | stream:文件流类型指针 返回值:成功时返回所读字符,遇到文件末尾或出错返回EOF(-1) |
char *fgets(FILE *stream) | stream:文件流类型指针 返回值:成功时返回所读字符串,遇到文件末尾或出错返回EOF(-1) |
int fputc(char ch, FILE *stream) | ch:要往文件写入的字符串 stream:文件流类型指针 返回值:写入成功时返回写入字符,出错时返回EOF(-1) |
int fputs(const char *s, FILE *stream) | ch:要往文件写入的字符串 stream:文件流类型指针 返回值:写入成功时返回一个非负的正整数,出错时返回EOF(-1) |
- getchar() 等同于 fgetc(stdin) ,两者的区别是一个是宏一个是函数。
- putchar(c) 等同于fputc(c, stdout)
按对象来读写
既可以读文本文件,也可以读二进制文件,效率高
1 | size_t fread(void *ptr, size_t size, size_t n, FILE *fp); |
- 返回值:成功返回读写的对象个数,出错时返回EOF(-1)
- ptr:读取的数据存放指针(fread),写入的数据存放的指针(fwrite)
- size:读或写入数据块的大小
- n:读或写入数据块的个数
- fp:要读取或写入的文件指针
注意:在写入数据后文件指针会指向写入数据的末尾,若要读取内容需要先关闭再打开、或者使用刷新指针指向。
文件流刷新定位函数
1 | int fflush(FILE *fp); |
- 返回值:成功返回0,失败返回EOF
- 将流缓冲区中的数据写入实际的文件
- Linux下只能刷新输出缓冲区,输入缓冲区丢弃
输出到屏幕使用stdout流
定位流函数
1 | long ftell(FILE *stream); |
ftell:函数成功时返回当前的读写位置,错误时返回EOF
fseek:定位一个流,成功时返回0,错误返回EOF,
- offset参数:偏移量,不能大于2G
- whence参数:SEEK_SET(文件开头偏移)、SEEK_CUR(以当前位置往后增加)、SEEK_END(文件尾增加偏移量)
rewind:使文件流指针返回文件开头位置进行读写
使用a模式打开文件时,fseek函数无效
格式化输入输出函数
1 | int fscanf(FILE *stream, const char *fmt, ...); // 从文件内容按格式取值到变量中 |
1 | int sprintf(char *s, const char *fmt, ...); // 格式化写入到缓冲区 |
- 成功时返回输出的字符个数,出错时返回EOF
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 嵌梦津途学思录!