【文件IO和部分标准IO】输入输出缓冲区和报错
1> 使用fread、fwrite实现两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{FILE *fp1=NULL;FILE *fp2=NULL;if((fp1=fopen("./01test.txt","r+"))==NULL){printf("打开文件失败\n");return -1;}if((fp2=fopen("./02test.txt","w"))==NULL){printf("打开文件失败\n");return -1;}int res;char buf[128]="";while(1){res=fread(buf,1,sizeof(buf),fp1);if(res<128){if(feof(fp1)){fwrite(buf,1,res,fp2);break;}if(ferror(fp1)){printf("fread操作失败\n");return -1;}}fwrite(buf,1,res,fp2);}fclose(fp1);fclose(fp2);return 0;
}
2> 使用fread、fwrite实现将一个文件中的所有数字写入到另一个新文件中
#include <myhead.h>
int main(int argc, const char *argv[])
{FILE *fp1=NULL;FILE *fp2=NULL;if((fp1=fopen("./01test.txt","r+"))==NULL){printf("打开文件失败\n");return -1;}if((fp2=fopen("./02test.txt","w"))==NULL){printf("打开文件失败\n");return -1;}int res,i=0;char sbuf[128]="";char buf;while(1){res=fread(&buf,1,sizeof(buf),fp1);if(res<1){if(feof(fp1)){break;}if(ferror(fp1)){printf("fread操作失败\n");return -1;}}if(buf>='0'&&buf<='9'){ sbuf[i]=buf;i++;}}fwrite(sbuf,1,i+1,fp2);fclose(fp1);fclose(fp2);return 0;
}
3> 使用文件IO完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{int fd1=-1;int fd2=-1;if((fd1=open("./t1.txt",O_RDWR))==-1)//r+{perror("open fd1 error");return -1;}if((fd2=open("./t2.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)//w{perror("open fd2 error");return -1;}//fd1=3,fd2=4printf("fd1=%d,fd2=%d\n",fd1,fd2);char buf[128]="";int res;while(1){res=read(3,buf,sizeof(buf));if(res==0){break;}write(fd2,buf,res);}return 0;
}
4> 将课堂代码重新实现遍
5> 思维导图
6> 标准IO和文件IO的区别与联系
函数不同,缓冲方式不同。联系:都是输入输出。
区别(不同点)
1. 操作对象不同
标准IO:操作的是标准流(stdin键盘输入、stdout屏幕输出、stderr错误输出)
文件IO:操作的是磁盘上的实际文件
2. 函数不同
标准IO:用
printf()
,scanf()
,getchar()
,puts()
文件IO:用
fopen()
,fclose()
,fread()
,fwrite()
3. 缓冲方式不同
标准IO:有缓冲区(数据先放缓冲区,满了再处理),效率高
文件IO:可以选缓冲方式,也可以直接操作(更底层)
4. 使用场景不同
标准IO:适合人机交互(输入输出简单数据)
文件IO:适合处理大文件、数据存储
联系(相同点)
1. 都是输入输出
都是用来处理数据的输入和输出
本质上都是数据流动
2. 底层都是系统调用
最终都要通过操作系统来真正读写数据
7> 牛客网刷题>=26