标准IO

1.标准IO和系统IO的区别
.1标准IO总是调用系统IO来完成自己的功能
系统IO:每个操作系统都有自己的IO方式

		windows:  openfile->内核->硬件
		linux:    open->内核->硬件
	
	标准IO:
	
		windows:  fopen->openfile->内核->硬件
		linux:    fopen->open->内核->硬件
		
.2标准IO有缓存区,系统IO没有缓存区

缓存区:所有标准IO的操作都会经过缓存区,然后再写到文件,缓存区绝大多数情况下是好事,最大的作用就是减少系统调用,提高效率

	缓存区分为三类:
	
		行缓存:遇到'\n'就会刷新缓存区  stdout  stdin
			1. 换行符刷新
			2. 程序正常结束
			3. 强制刷新缓存区 
			//fflush(文件指针),刷新指定文件,如果为NULL,刷新所有打开的文件
			4. 缓存区满
		
		可以通过setbuf修改缓存区大小
		
		全缓存:遇到换行符不会刷新   文件的默认缓存方式
			1. 程序正常结束
			2. 强制刷新缓存区 
			//fflush(文件指针),刷新指定文件,如果为NULL,刷新所有打开的文件
			2. 缓存区满
		
		无缓存:数据照样通过缓存区,只不过不会停留,数据是实时的  stderr
		
		//可以通过setvbuf修改缓存模式,但是不建议使用

一、标准IO
1.fopen
2.fclose

3.fputc
4fputs
5puts

6.fgetc
7fgets
8.gets

一、标准IO(day1)
1&2.fopen,fclose
/*
FILE *fopen(const char *path,const char *mode) //path为路径,mode为6总模式
//以指定的方式打开一个指定的文件,若成功,返回一个文件指针,若失败返回NULL,
并且设置errno的值
1.FILE * 文件指针
2.参数一:要打开文件的路径
参数二:打开的方式,是一个字符串,但只认识开头的第一个和+好
r 只读,打开之后,文件指针指向文件开头的位置
r+ 可读可写,打开之后,我简直指针指向文件开头的位置
w 只写,如果文件存在,将文件截断为0字节,文件指针指向文件开头的位置;
若文件不存在,创建(有则清空,无则创建

            w+  可读可写,有则清空,无则创建,文件指针指向文件开头的位置
            a   以追加的方式打开,文件指针指向文件末尾,若文件不存在,创建
            a+  以追加读写的方式打开,若读,文件指针指向开头
                                    若写,文件指针指向末尾,
                                    若无则创建
    
    perror("fail to fopen");//打印错误信息
    strerror(errno)返回错误信息

int fclose(FILE *fp)
    一个程序运行起来之后,默认会有3个文件被打开
    1.标准输入      stdin
    2.标准输出      stdout
    3.标准错误      stderr

stdin = fopen(/dev/stdin);
stdout = fopen(/dev/stdout);
stdin = fopen(/dev/stderr);    

3&6.fgetc,fputc(按字符输入输出)
int fgetc(FILE *stream);
//从指定的文件中获取一个字符,如果成功,将该字符转换为整型数返回,如果失败,返回EOF

EOF:一个宏值,一般规定为-1,读取文件结束或者读取出错都会返回EOF

feof(文件指针);//正常读取结束,返回0,如果读取错误,返回1



int fputc(int c, FILE *stream);
//将参数一写入到参数二所在的文件,成功返回该字符,失败返回EOF  

4&7. fgets,fputs(按行输入输出)
fgets fputs

char *fgets(char *s, int size, FILE *stream);
//从指定文件中读取规定大小的数据,存放到参数一中,一次最多读取size-1个字符,遇到’\n’也会停止

返回值:如果读取成功,返回该函数返回相同的 s 参数,读取结束和读取出错都会返回NULL
feof(文件指针);

int fputs(const char *s, FILE *stream);

//将参数一中的内容写入到指定文件中,成功返回1,失败返回EOF,设置errno的值

5&8
puts(“xxxx”); gets(“xxx”);
9. fread&fwrite(指定大小输入输出)
//size_t 是无符号整型 unsigned int

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

fread(读出来的数据,读取的每个数据的大小,读取数据的个数,文件指针);
//从指定的文件中读取规定的数据,存放到参数一中,如果读取成功,返回读取的实际个数,如果失败,返回0

hello'\n'

0 fread(buf,100,1,fp1);//返回值是0

6 fread(buf,1,100,fp1);//返回值是6


fwrite(buf,1,100,fp2);

buf[100];

建议:如果读取文件,每个数据的大小设置为1
ret = fread(buf,1,size,fp1)

如果读取块状数据,每个数据的大小设置为块的大小

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
fwrite(要写入的数据,每个数据的大小,写入数据的个数,文件指针);

10 . fseek(流的定位)
空洞文件:

	int fseek(FILE *stream, long offset, int whence);
		argument 2:偏移量(正代表往文件末尾方向)
	argument 3: 起始位置	

0 SEEK_SET 文件首
1 SEEK_CUR 当前文件指针所在位置
2 SEEK_END 文件末尾

	fseek(fp,0,SEEK_END);
	
	//创建一个1024个字节大小的空洞文件
	//创建空洞文件时,不要用追加的方式打开

   long ftell(FILE *stream);//获取当前文件指针的位置

   void rewind(FILE *stream);//将文件指针重新定位到文件开头
   
	//相当于fseek(fp,0,SEEK_SET);

格式化标准IO:

printf函数族:

   int printf(const char *format, ...);
   
   int fprintf(FILE *stream, const char *format, ...);
      
		fprintf(stdout,"%d",100);//相当于printf
		fprintf(stdout,"hello");
		//向指定文件中写入格式化数据或者字符串
   
   int sprintf(char *str, const char *format, ...);//字符串拼接
   //向指定的字符数组中写入格式化数据或者字符串
   sprintf(buf,"%c%d%c",'a',2,'b');
   
   int snprintf(char *str, size_t size, const char *format, ...);
   //上一个函数的安全版本

scanf函数族:

	int scanf(const char *format, ...);
	
	
   int fscanf(FILE *stream, const char *format, ...);
		fscanf(stdin,"%d",&a);//相当于scanf
		
		fscanf(fp,"%d%c",&b,&a);//慎用
    123456 123
   
   int sscanf(const char *str, const char *format, ...);//慎用

	sscanf(buf,"%c",&a);
	
	注意:使用%s操作的时候要小心
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值