🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🏡对比:printf/fprintf/sprintf和scanf/fscanf/sscanf
🐰文件操作
程序文件:后缀为 .c,.cpp,.exe等
数据文件:后缀为 .txt,.doc等
文件名包含三个部分:文件路径+文件名主干+文件后缀
例如:c:\code\tsest.txt
文件的操作:
文件的打开
文件操作(读或写)
文件的关闭
🌸文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的。取名为FILE
注意:不同的c编译器的FILE类型包含的内容的不完全相同
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE变量,并填充其中的信息
一般都是通过一个FILE的指针来维护这个FILE结构的变量。
创建一个FILE*的指针变量
FILE* pf;//文件指针变量
注意:通过文件指针变量可以访问与它关联的文件
🌸打开文件
ASICN规定使用fopen函数来打开文件,fclose来关闭文件
fopen的原型:
1. FILE * fopen ( const char * filename, const char * mode ); 2. 3. const char * filename:文件名 4. 5. const char * mode:打开方式
注意:如果打开成功,打开失败返回空指针
常见打开方式有:
1. "r":读 2. 3. "w":写 4. 5. "a":追加 6. 7. "r+":可以读,可以更新 8. 9. "w+":可以写,可以更新 10. 11. "a+":可以追加,可以更新
创建一个文件指针去向文件中写入数据
1. #include<stdio.h> 2. #include<string.h> 3. #include<errno.h> 4. #include<stdlib.h> 5. int main() 6. { 7. //打开文件 8. FILE* pf=fopen("test.txt", "w"); 9. if(pf==NULL) 10. { 11. //printf("%s\n",strerror(errno)); 12. perror("fopen");//如果打开失败打印原因 13. return 1; 14. } 15. //写文件 16. //关闭文件 17. fclose(pf); 18. pf=NULL; 19. system("pwd"); 20. return 0; 21. }
🏡文件的顺序读写
🌸fputc字符输入函数(适合所有输入流)
fputc向文件写数据
fputc的原型:
int fputc ( int character, FILE * stream );
int character:写的单个字符
FILE * stream:文件相关联的文件指针
1. #include<stdio.h> 2. int main() 3. { 4. FILE* pf=fopen("test.txt", "w"); 5. //写文件 6. //把26个字母写到文件中 7. //fputc('a',pf); 8. for(int i=0;i<26;i++) 9. { 10. fputc('a'+i,pf); 11. } 12. //关闭文件 13. fclose(pf); 14. pf=NULL; 15. return 0; 16. }
🌸fgetc(适合所有的输出流)
fgetc的原型:
int fgetc ( FILE * stream );
FILE * stream :文件相关联的文件指针
返回的是ASCII码值
fgetc读取一个字符时,文件指针的位置会往后移动(注意这里的文件指针不是自己创建的那个(pf)而是系统自带的文件指针)
fgetc如果读取失败或则读取完成时,会返回一个EOF
1. #include<stdio.h> 2. int main() 3. { 4. FILE* pf=fopen("test.txt", "r"); 5. //写文件 6. //从文件中读取26字母字符 7. for(int i=0;i<26;i++) 8. { 9. int ch=fgetc(pf); 10. printf("%c ",ch); 11. } 12. //关闭文件 13. fclose(pf); 14. pf=NULL; 15. return 0; 16. }
🌸fputs(适合所有的输入流)
fputs的原型:
int fputs ( const char * str, FILE * stream );
const char * str:写入的字符串
FILE * stream :文件相关联的文件指针
如果写入成功返回非负数,写入失败返回EOF
1. #include<stdio.h> 2. int main() 3. { 4. FILE* pf=fopen("test.txt", "w"); 5. //写文件 6. //写一行数据,"hello bit" 7. fputs("hello bit\n",pf);//加入'\0'可以给每次写入数据换行,如果不写'\0'不会自动换行 8. fputs("hello world\n",pf); 9. //关闭文件 10. fclose(pf); 11. pf=NULL; 12. return 0; 13. }
🌸fgets(适合所有的输出流)
fgets的原型:
char * fgets(char * str,int num,FILE * stream);
char * str:存放读取字符的空间
int num:读取字符的个数
FILE * stream:相关联的文件指针
最多读取num-1个字符,因为第num个字符要存放'\0'
1. #include<stdio.h> 2. int main() 3. { 4. FILE* pf=fopen("test.txt", "r"); 5. //写文件 6. //从文件中读取数据 7. char str[20]; 8. fgets(str, 5, pf); 9. printf("%s\n",str); 10. //关闭文件 11. fclose(pf); 12. pf=NULL; 13. return 0; 14. }
🏡格式化的读写
🌸fprintf(适合所有的输入流)
fprintf的原型:
int fprintf ( FILE * stream, const char * format, ... );
和printf一样,只是添加了一个流,FILE * stream
1. #include<stdio.h> 2. typedef struct S 3. { 4. int n; 5. float f; 6. char arr[20]; 7. }S; 8. int main() 9. { 10. S s1={100,3.14,"zhnagsan"}; 11. //打开文件 12. FILE* pf=fopen("test.txt","w"); 13. //写文件 14. fprintf(pf,"%d %lf %s",s1.n,s1.f,s1.arr); 15. //关闭文件 16. fclose(pf); 17. pf=NULL; 18. return 0; 19. }
🌸fscanf读取文件(适合所有的输出流)
fscanf的原型:
int fscanf ( FILE * stream, const char * format, ... );
和scanf一样,只是添加了一个流,FILE * stream
1. #include<stdio.h> 2. typedef struct S 3. { 4. int n; 5. float f; 6. char arr[20]; 7. }S; 8. int main() 9. { 10. S s1={0}; 11. //打开文件 12. FILE* pf=fopen("test.txt","r"); 13. //写文件 14. fscanf(pf, "%d %f %s",&s1.n,&s1.f,s1.arr); 15. printf("%d %f %s",s1.n,s1.f,s1.arr); 16. //关闭文件 17. fclose(pf); 18. pf=NULL; 19. return 0; 20. }
🏡流
读写文件的时候:文件流
终端设备->屏幕:标准输出流 stdout
终端键盘->键盘:标准输入流 stdin
终端设备->屏幕:标准错误流 stderr
C程序会默认会打开3个流:stdout,stdin,stderr
🌸从键盘这个流(stdin)读入数据
1. #include<stdio.h> 2. int main() 3. { 4. char arr[20]={0}; 5. fgets(arr,9,stdin); 6. printf("%s",arr); 7. return 0; 8. }
🌸屏幕这个流(stdout)输出
1. #include<stdio.h> 2. typedef struct S 3. { 4. int n; 5. float f; 6. char arr[20]; 7. }S; 8. int main() 9. { 10. S s1={0}; 11. fscanf(stdin,"%d %f %s",&s1.n,&s1.f,s1.arr); 12. fprintf(stdout,"%d %f %s",s1.n,s1.f,s1.arr); 13. return 0; 14. }
🏡对比:printf/fprintf/sprintf和scanf/fscanf/sscanf
sacnf 针对标准输入流(stdin)的格式化的输入函数
printf针对标准输出流(stdout)的格式化的输入函数
fscanf针对所有的输入流(文件流/stdin)的格式化的输入函数
fprintf针对所有的输出流(文件流/stdout)的格式化的输入函数
sscanf/sprintf
🌸sprintf(把格式化数据转换成字符串)
sprintf的原型:
int sprintf ( char * str, const char * format, ... );
char * str:存放转化后的字符串的空间
const char * format, ...:格式化的数据,'...'是可变参数,因此可以是多个格式化的数据
🌸sscanf(把字符串转换成相应格式化数据)
sscanf的原型:
int sscanf ( const char * s, const char * format, ...);
char * str:存放转化后的字符串的空间
const char * format, ...:格式化的数据,'...'是可变参数,因此可以是多个格式化的数据
1. #include<stdio.h> 2. typedef struct S 3. { 4. int n; 5. float f; 6. char arr[20]; 7. }S; 8. int main() 9. { 10. S s1={200,3.5f,"wangwu"}; 11. //把一个结构体转化成字符串 12. char arr[200]={0}; 13. sprintf(arr,"%d %f %s",s1.n,s1.f,s1.arr); 14. printf("%s",arr); 15. 16. //把一个字符串转化为对应格式数据 17. S s2={0}; 18. sscanf(arr, "%d %f %s",&s2.n,&s2.f,s2.arr); 19. printf("%d %f %s",s2.n,s2.f,s2.arr); 20. return 0; 21. }
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸