
标准 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;
}

8810

被折叠的 条评论
为什么被折叠?



