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操作的时候要小心