目录
1. IO的概念理解
2. IO的分类
3. FIEL结构体
4. IO接口函数(标准IO)
4.1 fopen( 功能:打开一个文件)
4.2 fclose(功能:关闭一个文件)
4.3 strerror(根据错误码返回错误信息)
4.4 perror(功能:打印错误信息)
4.5 fgetc/fputc(功能:从文件读取/写入一个字符串)
5. 标准IO缓冲区
5.1 缓冲区的大小
5.2 行缓存刷新机制
5.3 全缓存刷新机制
5.4 主动刷新缓冲区
1. IO的概念理解
#include<stdio.h> //其中的的stdio 便是我们经常使用的IO,这个属于系统IO
讯享网
2. IO的分类
2.1 标准IO(库函数) //上方的举例便属于标准IO
printf scanf fopen fread fwrite fclose fgetc fputc fgets fputs.都属于标准IO
2.2 文件IO(系统调用)
open read write close都属于文件IO
系统调用和库函数分别是什么:系统调用是用户访问内核空间的一个过程,效率比较低,每次系统调用都要从用户空间到内核空间调用一次内核。而库函数相当于系统调用+缓冲区实现的,可移植性比较强,执行效率高。
3. FIEL结构体
3.1 FIEL结构体用来描述打开的文件的,只要打开一个文件,就会产生FIEL结构体,在一个已经运行的程序中默认产生三个FILE结构体:
讯享网//三个FIEL结构体 stdin:标准输入 stdout:标准输出 stderr:标准出错
4. IO接口函数(标准IO)
4.1 fopen( 功能:打开一个文件)
功能、参数、返回值如下:
#include <stdio.h> FILE *fopen(const char *pathname, const char *mode); 功能:打开一个文件 参数: @pathname:文件的路径及文件的名字(字符指针) @mode:打开文件的方式 r: 以只读的方式打开文件,将光标定位在文件的开头 r+: 以读写的方式打开文件,将光标定位在文件的开头 w: 以只写的方式打开文件,如果文件不存在创建文件, 如果文件存在清空文件,将光标定位在文件的开头 w+: 以读写的方式打开文件,如果文件不存在创建文件, 如果文件存在清空文件,将光标定位在文件的开头 a:以只写的方式打开文件,如果文件不存在就创建, 如果文件存在将光标定位在文件的结尾 a+:以读写的方式打开文件,如果文件不存在就创建, 如果文件存在写在结尾写,如果文件存在读在开头读 返回值:成功返回FILE的指针,失败返回NULL,置位错误码
fopen使用示例:
讯享网#include <stdio.h> int main(int argc, char const *argv[]) { FILE *fp; //以只写的方式打开文件,如果文件不存在就创建文件 // ./test.txt 文件的路径和文件的名字 //"r" 权限 fp = fopen("./test.txt","r"); if(fp == NULL){ printf("open file error\n"); return -1; } printf("open file success\n"); return 0; }
4.2 fclose(功能:关闭一个文件)
功能、参数、返回值如下:
#include <stdio.h> int fclose(FILE *stream); 功能:关闭文件 参数:@stream:文件指针 返回值:成功返回0,失败返回-1(EOF),置位错误码
fclose示例:
讯享网#include <stdio.h> int main(int argc, char const *argv[]) { FILE *fp; //以只写的方式打开文件,如果文件不存在就创建文件 //“./test.txt”文件的路径和文件的名字 //"w" 权限 fp = fopen("./test.txt","w"); if(fp == NULL){ printf("open file error\n"); return -1; } printf("open file success\n"); //关闭文件 if(fclose(fp)){ printf("close file error\n"); return -1; } fclose(stdin); fclose(stdout); fclose(stderr); return 0; }
4.3 strerror(根据错误码返回错误信息)
功能、参数、返回值如下:
#include <string.h> char *strerror(int errnum); 功能:根据错误码,转换出来错误信息 参数:@errnum:错误码 返回值:错误信息
strerror示例:
讯享网#include <stdio.h> #include <errno.h> #include <string.h> extern int errno; int main(int argc, char const *argv[]) { FILE *fp; fp = fopen("./test.txt","r"); if(fp == NULL){ printf("errno = %d\n",errno); //将错误信息通过printf打印出来 printf("%s\n",strerror(errno)); printf("open file error\n"); return -1; } printf("open file success\n"); return 0; }
错误码原理:fopen会调用底层的sys_open,sys_open执行失败时将程序的错误码传递给errno的变量,可以通过这个变量获取到底层的错误。
4.4 perror(功能:打印错误信息)
功能、参数、返回值如下:
void perror(const char *s); 功能:直接打印错误信息 (自动加上'\n') 参数:@s:用户附加的错误信息 返回值:无
perror示例:
讯享网#include <stdio.h> #include <errno.h> #include <string.h> int main(int argc, char const *argv[]) { FILE *fp; fp = fopen("./test.txt","r"); if(fp == NULL){ perror("open file"); return -1; } printf("open file success\n"); return 0; }
4.5 fgetc/fputc(功能:从文件读取/写入一个字符串)
功能、参数、返回值:
int fgetc(FILE *stream); 功能:从文件中读取一个字符 参数: @stream:FILE的结构体指针 返回值:成功返回读取到字符的ascii码,失败返回EOF(-1) //-------------------------------------------------------------------------------------- int fputc(int c, FILE *stream); 功能;向文件中写一个字符 参数: @c:被写的字符 @stream:FILE指针 返回值:成功返回读取到字符的ascii码,失败返回EOF(-1)
fgetc/fputc示例:
讯享网#include <stdio.h> #define PRINT_ERR(msg) do{ \ perror(msg);\ return -1;\ }while(0) int main(int argc, char const *argv[]) { char ch; FILE *fp; //1.打开文件 fp = fopen("./hello.txt","r"); if(fp == NULL) PRINT_ERR("open error"); //2.读取文件中的字符 ch = fgetc(fp); printf("ch = %c\n",ch); //3.关闭文件 fclose(fp); return 0; }
#include <stdio.h> #define PRINT_ERR(msg) do{ \ perror(msg);\ return -1;\ }while(0) int main(int argc, char const *argv[]) { FILE*fp; //1.参数检查 if(argc != 2){ printf("input error,try again\n"); printf("usage: ./a.out filename\n"); return -1; } //2.打开文件 if((fp = fopen(argv[1],"w+")) == NULL) PRINT_ERR("open file error"); //3.向文件中写入hello fputc('h',fp); fputc('e',fp); fputc('l',fp); fputc('l',fp); fputc('o',fp); //4.关闭文件 fclose(fp); return 0; }
5. 标准IO缓冲区
5.1 缓冲区的大小
全缓存:文件的缓冲区就是全缓存,大小是4096
行缓存:和终端相关的相关缓冲区就是行缓存(stdin stdout),大小就是1024
不缓存:没有缓冲区(stderr),大小就是0
5.2 行缓存刷新机制
1.行缓存在遇到‘\n’的时候会刷新缓冲区
2.行缓存在在程序结束的时候,也会刷新缓冲区
3.标准输入和标准输出发生切换的时候也会刷新缓冲区
4.当文件关闭的时候也会刷新缓冲区
5.当主动调用fflush的时候也会刷新缓冲区
6.当行缓存满的时候刷新缓冲区,如果多于1024个字符,再次被放入缓冲区中
5.3 全缓存刷新机制
1.程序结束会刷新缓冲区
2.遇到fclose(fp)会刷新缓冲区
3.输出和输入切换的时候也会刷新缓冲区
4.fflush(fp)也会刷新缓冲区
5.缓冲区满也会刷新缓冲区(4096)
5.4 主动刷新缓冲区
讯享网int fflush(FILE *stream); 功能:主动刷新缓冲区 参数: @stream:文件指针 返回值:成功返回0,失败返回EOF并置位错误码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/69664.html