文章目录
article
stdio
AI文章摘要
qwen-turbo-latest
加载中...
1. stdio.h
1.1 数据结构
标准IO库提供一些简单高效的IO流接口, 输入输出被映射到本地数据流, 对物理接口进行屏蔽. 标准IO库实现了三个流: 标准输入流stdin(带有流缓存). 标准输出流stdout(带有流缓存)、标准错误流stderr(不带有流缓存)
- 流缓存: 文件流都有缓存, 而且几乎所有编译器都只在缓冲区满时才刷新缓冲区
- 流光标: 文件光标是char* 类型的指针, 显示时是相对于文件首字节的位移值.
- 流状态: 当文件流函数读取到文件末尾时, 再尝试读取时文件流状态置为false并返回EOF
#define EOF -1 //意为文件结尾
typedef struct{
short level; //流缓冲区"满"或者"空"的程度
unsigned char flags; //文件状态标志
char fd; //文件描述符
unsigned char hold; //如无缓冲区不读取字符
short bsize; //流缓冲区的大小
unsigned char* buffer; //流缓冲区的指针
unsigned char* curp ; //当前活动指针
unsigned istemp; //临时文件,指示器
short token; //用于有效性的检查
}FILE;
1.2 函数
FILE* fopen(const char * filename, const char * mode)
int fclose(FILE * stream)关闭先前fopen()打开的文件.此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream): 将ptr位置开始的size*nmemb字节拷贝到文件流中, 返回成功写入的块个数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);将流光标位置size*nmemb字节的拷贝到ptr指向的位置
int fseek(FILE *stream, long offset, int )
long ftell(FILE *stream)返回文件光标值(可以认为是光标跨过的字节数)
void rewind(FILE *stream)将光标的值设为0,回到文件首部
int feof(FILE * stream)判断文件流状态, 最近一次读取失败时文件流会置false, 之后feof才会返回false, 所以foef有滞后性.
void perror(const char *str)
- filename: 文件路径是操作系统给定的逻辑路径, 由系统前缀、字段分隔符和字段组成. 不同的操作系统字段分隔符不同, Windows下'\'
- 绝对路径: 是文件的完整全局逻辑路径 例如: "c:\\test\\passwd.txt"
- 相对路径: 是文件相对于当前目录的简写路径, 当前目录指的是可执行程序所在目录 例如:".\\passwd.txt"表示程序当前文件夹下
- mode:
- r或rb: 输入模式(只读模式),文件不存在会报错
- w或wb: 输出模式(只写模式), 创建文件, 若文件已存在则之直接覆盖
- a或ab: 追加输出模式(追加模式), 向文件追加内容, 若文件不存在则创建文件
- r+或rb+: 输入输出模式(读写模式), r模式的基础上增加写功能
- w+或wb+: 输入输出模式(读写模式), w模式的基础上增加读功能
- a+或ab+: 追加输入输出模式(带读功能的追加模式), a模式的基础上增加读功能
- 二进制模式: 将数据源解读为二进制数据, 无差别读写数据源.
- 文本模式: 将数据源解读为文本, 不同操作系统对\n有不同的处理方式
- Window系统文本的行结束符为\r\n. 文本模式下的输出\n将替换成\r\n, 输入\r\n将替换成\n. 二进制模式原样输出.
- Linux系统的文本的行结束符就是\n, 文本模式不会替换, 文本模式和二进制模式是完全一致的
- Mac系统 …
- offset: 位移量,可以是负数
- whence 光标起始位置
- SEEK_SET (0) 文件开头光标值为0
- SEEK_CUR (1) 文件当前光标值
- SEEK_END (2) 文件结尾光标值移动到了EOF前面
//单字符IO函数
int getchar(void)从stdin读取一个字符, 返回这个字符的ASCII整形值
int putchar(int char): 将一个字符输出到 stdout, 输出的字符的ASCII整形值
int fgetc(FILE * stream)从文件读1个字符, 返回字符的ASCII值, 若读取失败返回EOF并设置流状态
int fputc(int ch, FILE * stream)写1个字符到文件中, 成功时返回写入字符ASCII值
while( (ch=fgetc(fp) )!=EOF) { putchar(ch); }
//字符串IO函数
char* gets(char* buff , int buffSize)读取stdin中第一个\n前所有字符并追加\0, 并清除stdin中的\n .
int puts (const char * buff) 向stdout输出一个字符串(不包含\0),并换行
char* fgets(char *s, int count, FILE *stream): 从相应的流中读入count-1个字符, 当(1)读到换行符(写入)、(2)读到EOF(不写入)、(3)或是已读了size - 1个字符为. 止最后会预留的一个字符写入'\0'作为字符串结束
int fputs(const char * string, FILE *stream): 将string所指定的字符串写入到stream指定的文件中, 字符串结束符'\0'不写入文件, 该函数为puts的文件操作版本,输出的时候不自带换行
- fgets只接受size-1个字符, 执行一次, 光标最长移动size-1
- 文件光标的值可以看作是已读字符个数
//输入转换函数
int scanf(const char* restrict format,...)根据format规定的格式读取stdin中数据赋值给相应的变量
int sscanf(const char *str, const char *format, ...)根据format规定的格式读取str中数据赋值给相应的变量
int fscanf(FILE * stream, const char * format, ...);
- str: 字符串的首地址
- format:
- 字符占位符: %nc 读取n(缺省为1)域宽任意字节, 不追加\0. 可能读到\n!!!!!
- 字符串占位符: %ns 读取第一个\n或空格的前n(缺省为无限)个字符, 并追加\0. 不清除\n!!!!
- %[^a-c] 排除abc的所有字符
- %[0-9] 只要0-1的字符
- %[abc] 只扫描abc
- %[^\n] 接收换行符, 适合字符串中含有空格的
- 数值型占 - 符: %nd 读取第一个非数字字符的前n(缺省为无限)个数字, 将其转换为整形. 不清除\n!!!!
- %nx 或 %nX : 读取16进制数
- %no :读取8进制数
- %nf 和%nlf: 读取n位单精度或双精度浮点数(注意这个占位符接收 '.' 号!!!!)
- 示例: 输入"hello world"(带空格)
- scanf("%[^\n]",arr);//默认空格也是可以作为变量赋值结束符的,但是使用通配符可以只让回车作为结束符
- 多变量输入
- scanf("%d%d%d",&a,&b,&c);
- scanf("%d\n%d\n%d",&a,&b,&c);
- scanf("%d %d %d",&a,&b,&c);//这三种方法都是正确的,都可以用空格或者回车来分隔变量输入
- 定长输入
- scanf("%2d%2d%2d",&a,&b,&c);//等距定长输入:123456,abc分别是12,34,56
- scanf("%1d%2d%3d",&a,&b,&c);//不等距输入:123456,abc分别是1,23,456
- scanf函数中%d表示的值是什么类型的在输入缓存中就拿那个类型的
//输出转换函数
int printf(const char *format, ...): 将内容输出到 输出流缓冲区win下直接输出.
int sprintf(char *str, const char *format, ...);将内容输出到 字符串 保存
int fprintf(FILE * stream, const char * format, ...);
- format:
- 数值占位符:
%d 整形int
%o 八进制int
%x 小写十六进制int
%X 大写十六进制int
%e 科学计数法 只接受double数据类型
%lf 双精度浮点数double
%f 单精度浮点数float
- 字符占位符:
%c 字符输出 整形(int、short、long int、unsigned int、char……)
%s 字符数组指针 char*
printf("你的文字在这里%-7.4lf", a );
//你的文字在这里a,其中a的格式为7列保留4为有效数字左对齐
//其中小数和小数点也占列数,但整个数据列数没占够7列时左补空格,
//若 - 改为 0 则左补0
int remove(const char *pathname);删除文件
int rename(const char *oldpath, const char *newpath);删除原文件,创造新文件根据这个特性,可以用来重命名文件或者移动文件