文件操作以及相关的函数,fputc,fgetc,fputs,fgtes,fprintf,fscanf,sprintf,sscanf

简介: 🐰文件操作🌸打开文件🏡文件的顺序读写🌸fputc字符输入函数(适合所有输入流)🌸fgetc(适合所有的输出流)🌸fputs(适合所有的输入流)🌸fgets(适合所有的输出流)🏡格式化的读写🌸fprintf(适合所有的输入流)🌸fscanf读取文件(适合所有的输出流)🏡流🌸屏幕这个流(stdout)输出🏡对比:printf/fprintf/sprintf和scanf/fscanf/sscanf🌸sprintf(把格式化数据转换成字符串)🌸sscanf(把字符串转换成相应格式化数据)

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰文件操作

🌸打开文件

🏡文件的顺序读写

🌸fputc字符输入函数(适合所有输入流)

🌸fgetc(适合所有的输出流)

🌸fputs(适合所有的输入流)

🌸fgets(适合所有的输出流)

🏡格式化的读写

🌸fprintf(适合所有的输入流)

🌸fscanf读取文件(适合所有的输出流)

🏡流

🌸屏幕这个流(stdout)输出

🏡对比:printf/fprintf/sprintf和scanf/fscanf/sscanf

🌸sprintf(把格式化数据转换成字符串)

🌸sscanf(把字符串转换成相应格式化数据)


🐰文件操作

程序文件:后缀为 .c,.cpp,.exe等

数据文件:后缀为 .txt,.doc等

文件名包含三个部分:文件路径+文件名主干+文件后缀

例如:c:\code\tsest.txt

CBEE53AA-07DF-4085-B799-4E1E929A703A.png

 

文件的操作:

文件的打开

文件操作(读或写)

文件的关闭

🌸文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的。取名为FILE

896252B2-A365-4645-B233-556FBD1C8017.png

 

注意:不同的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. }

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸



相关文章
|
存储 测试技术 编译器
文件操作【fopen/fclose/fputs/fgets】【C语言/进阶】
文件操作【fopen/fclose/fputs/fgets】【C语言/进阶】
146 0
|
9月前
|
存储
fread和fwirte函数
fread和fwirte函数
61 0
|
4月前
|
存储
底层文件操作的各种函数(二)------printf,fprintf,sprintf,scanf,fscanf,sscanf的对比以及文件缓冲区
底层文件操作的各种函数(二)------printf,fprintf,sprintf,scanf,fscanf,sscanf的对比以及文件缓冲区
74 2
|
8月前
|
C语言
【C语言】:浅谈函数 fscanf/sscanf 和 fprintf/sprintf
【C语言】:浅谈函数 fscanf/sscanf 和 fprintf/sprintf
120 1
|
8月前
fgets函数和fputs函数的使用
fgets函数和fputs函数的使用
|
9月前
|
机器学习/深度学习
fprintf()函数和fwrite()函数
fprintf()函数和fwrite()函数
85 1
|
9月前
|
存储 人工智能 程序员
文件操作(一、fgets和fputs、fscanf和fprintf、fread 和 fwrite、fopen和fclose、fgetc和fputc)
文件操作(一、fgets和fputs、fscanf和fprintf、fread 和 fwrite、fopen和fclose、fgetc和fputc)
|
9月前
|
C语言
文件操作(二、scanf/fscanf/sscanf​与printf/fprintf/sprintf​、fseek与ftell与rewind、feof)
文件操作(二、scanf/fscanf/sscanf​与printf/fprintf/sprintf​、fseek与ftell与rewind、feof)
|
存储 C语言 数据安全/隐私保护
c语言文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和区别
c语言文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和区别
234 0
|
C语言
【C语言】scanf/fscanf/sscanf和printf/fprintf/sprintf的详细介绍
【C语言】scanf/fscanf/sscanf和printf/fprintf/sprintf的详细介绍