一.缓冲区
转载请加上:https://blog.csdn.net/qq_37978862/article/details/104369706
###1.什么是io:Linux下读写文件的方式
为什么有缓冲区:标准io的机制,在执行系统调用的时候,Linux必须从用户态切换到内核态,处理相应请求,然后再回到用户态,频繁的执行系统调用,就会增加系统开销。为了避免这种情况,标准io在用户空间创建了1k的缓冲区,读写先操作缓冲区,然后在需要的时候,再进行系统调用。
###2.流:标准io操作的对象(描述文件信息的结构体)
###3.缓冲区种类:
(1)全缓冲:普通文件用标准io打开,默认是全缓冲的
(2)行缓冲:遇到 ‘\n’
(3)不缓冲: 标准出错流就是不带缓冲区的,所以出错信息,可以直接显示到终端上
二.标准io的具体操作
基本步骤:打开,读写,关闭
###1.打开与关闭
FILE *f = fopen("./a.c","r");
//参数一:路径名字
//参数二:打开方式
//w:以只写的方式打开,
//如果文件不存在,则创建
//w+:以读写的方式打开,其余w
//r:以只读的方式打开,要求文件必须存在
//r+:读写,其余同r
//a:以追加只写的方式打开,
//如果文件不存在,则创建
//a+:读写,其余同a
//返回值:成功返回流指针,失败返回NULL
fclose(f);
###2.按字节读写
关键点:文件的结束标志: EOF
代码示例:
#include<stdio.h>
#include<string.h>//strerror
#include<errno.h>//errno
int main(int argc,char *argv[])
{
if( argc<2 )
{
printf("argv[1]:\n");
return -1;
}
//打开
FILE *f = fopen(argv[1],"r");
FILE *f1 = fopen("./a.c","w");
if( f == NULL || f1 == NULL )
{
printf("%s",strerror(errno));
fflush(stdout);
return -1;
}
//读写
int x;
while( (x = fgetc(f))!= EOF )
//读:fegtc()
//参数:流指针
//返回值:读到的字节
{
fputc(x,f1);
//写:fputc()
//参数一:存字节的变量
//参数二:流指针
//返回值:成功写入的c,失败:EOF
}
//关闭
fclose(f);
fclose(f1);
return 0;
}
###3.按行读写
#include<stdio.h>
#include<string.h>//strerror
#include<errno.h>//errno
int main(int argc,char *argv[])
{
if( argc<2 )
{
printf("argv[1]:\n");
return -1;
}
//打开
FILE *f = fopen(argv[1],"r");
FILE *f1 = fopen("./a.c","w");
if( f == NULL || f1 == NULL )
{
printf("%s",strerror(errno));
fflush(stdout);
return -1;
}
//读写
char buf[256];
while ( fgets(buf,sizeof(buf),f)!= NULL )
//读:
//参数一:存放内容的容器首地址
//参数二:容器大小
//参数三:流指针
//返回值:成功返回首地址,失败返回NULL
{
fputs(buf,f1);
//参数一:容器首地址
//参数二:流指针
//返回值不考虑
}
//关闭
fclose(f);
fclose(f1);
return 0;
}
###4.按类型读写
#include <stdio.h>
#include <string.h> //strerror
#include <errno.h> //errno
int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("argv[1]:\n");
return -1;
}
//打开
FILE *f = fopen(argv[1], "r");
FILE *f1 = fopen("./a.c", "w");
if (f == NULL || f1 == NULL)
{
printf("%s", strerror(errno));
fflush(stdout);
return -1;
}
//读写
char buf[256];
int x;
do
{
x = fread(buf,1,sizeof(buf),f);
//参数一:容器
//参数二:类型所占字节
//参数三:打算读取内容的个数
//参数四:流指针
//返回值:实际读到的个数
fwrite(buf,1,x,f1);
//参数一:容器
//参数二:类型所占字节数
//参数三:
//参数四:流指针
//返回值:实际读到内容的个数
}while(x == sizeof(buf) );
//关闭
fclose(f);
fclose(f1);
return 0;
}
###5.定位
//打开
FILE *f = fopen(argv[1], "r");
fseek(f,10,SEEK_SET);
//参数一:流指针
//参数二:偏移量
//参数三:参照位置
//返回值:成功0
printf("%ld",ftell(f));
//参数:;流指针
//返回值:据文件开头偏移量