🤖 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);删除原文件,创造新文件根据这个特性,可以用来重命名文件或者移动文件