【无标题】

在这里插入图片描述
标准 IO 和文件 IO 都是计算机中数据输入输出的方式,它们既有区别也有密切联系:
区别
操作对象不同
标准 IO(Standard IO):主要面向终端设备,包括标准输入(stdin,通常是键盘)、标准输出(stdout,通常是显示器)和标准错误输出(stderr,通常也是显示器)
文件 IO(File IO):主要面向存储设备上的文件,包括普通文件、设备文件、管道文件等
接口实现不同
标准 IO:属于 C 语言库函数(如printf、scanf、fopen、fread等),在不同操作系统上有统一的接口
文件 IO:属于系统调用(如 Linux 的open、read、write、close),不同操作系统接口可能不同
缓冲机制不同
标准 IO:提供了缓冲机制(全缓冲、行缓冲、无缓冲),减少系统调用次数,提高效率
文件 IO:通常无缓冲(或只有内核缓冲),每次操作可能直接调用系统接口
操作单位不同
标准 IO:以流(stream)为操作单位,通过FILE*指针标识
文件 IO:以文件描述符(file descriptor)为操作单位,是一个非负整数
联系
本质相通:标准 IO 本质上是对文件 IO 的封装,最终都会通过系统调用来完成实际的 IO 操作
可相互转换:标准 IO 的流可以与文件 IO 的文件描述符相互转换(如fileno和fdopen函数)
统一的 IO 模型:两者都遵循 “打开 - 读写 - 关闭” 的操作流程
标准流也是文件:在操作系统中,标准输入、输出和错误输出也被视为特殊的文件,有对应的文件描述符(0、1、2)

简单来说,标准 IO 是跨平台的高级接口,更易使用且效率较高;文件 IO 是底层系统接口,更接近硬件,灵活性更高。在实际开发中,通常优先使用标准 IO,仅在需要特殊控制时才使用文件 IO。
在这里插入图片描述

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    /* code */
    if(argc!=3){
        printf("argc is erro");
        return 1;
    }
    FILE* fp1=fopen(argv[1],"rb");
    FILE* fp2=fopen(argv[2],"wb");
    if(fp1==NULL||fp2==NULL) fprintf(stderr,"fopen %s or fopen %s",argv[1],argv[2]);
    char buf[1024];
    size_t resr=0;
    while((resr=fread(buf,1,sizeof(buf),fp1))>0){
        if(resr!=fwrite(buf,1,resr,fp2)){
            fprintf(stderr,"fwrite is error\n");
            fclose(fp1);
            fclose(fp2);
            return 1;
        }
    }
    if(ferror(fp1)) fprintf(stderr,"fread is error\n");
    fclose(fp1);
    fclose(fp2);
    return 0;
}

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char const *argv[])
{
    /* code */
    if(argc!=3){
        fprintf(stderr,"this %d is err\n",argc);
        return 1;
    }
    FILE* fp1=fopen(argv[1],"rb");
    FILE* fp2=fopen(argv[2],"wb");
    if(NULL==fp1||NULL==fp2){
        fprintf(stderr,"fopen %s or %s is err\n",argv[1],argv[2]);
        return 1;
    }
    char buf1[1024],buf2[1024];
    size_t resr=0;
    while((resr=fread(buf1,1,sizeof(buf1),fp1))>0){
        size_t cnt=0;
        int k=0;
        while(k<resr){
            if(isdigit(buf1[k])) buf2[cnt++]=buf1[k];
            k++;
        } 
        if(cnt!=fwrite(buf2,1,cnt,fp2)){
            fprintf(stderr,"fwrite %s is err\n",argv[2]);
            fclose(fp1);
            fclose(fp2);
            return 1;
        }
    }
    if(ferror(fp1)) fprintf(stderr,"fread the file %s is err\n",argv[1]);
    fclose(fp1);
    fclose(fp2);
    return 0;
}

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    /* code */
    if(argc!=3){
        fprintf(stderr,"this argc %d is err\n",argc);
        return 1;
    }
    int fd1=open(argv[1],O_RDONLY,0444);
    int fd2=open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,0644);
    if(-1==fd1||-1==fd2){
        fprintf(stderr,"open %s or %s is err\n",argv[1],argv[2]);
        close(fd1);
        close(fd2);
        return 1;
    }
    ssize_t count=0;
    char buf[1024];
    while((count=read(fd1,buf,sizeof(buf)))>0){
        if(count!=write(fd2,buf,count)){
            close(fd1);
            close(fd2);
            return 1;
        }
    }
    if(count==-1) fprintf(stderr,"read is er:%s\n",strerror(errno));
    close(fd1);
    close(fd2);
    return 0;
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值