Linux 标准io

一.缓冲区

转载请加上: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));
    //参数:;流指针
    //返回值:据文件开头偏移量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值