文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof

简介: 🐰文件操作🌸 fwrite🌸fread🌸fseek🌸fteel🌸rwind🌸文本文件和二进制文件🌸文件结束的判定🌸文件缓冲区🌸 实现拷贝一个文件

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

目录

🐰文件操作

🌸 fwrite

🌸fread

🌸fseek

🌸fteel

🌸rwind

🌸文本文件和二进制文件

🌸文件结束的判定

🌸文件缓冲区

🌸 实现拷贝一个文件


🐰文件操作

🌸 fwrite

fwrite向文件写入二进制数据

fwrite的原型:

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

const void * ptr:指向要写出数据的内存首地址

size_t size:要写出数据的基本单元的字节大小

size_t count:要写数据基本单元的个数

FILE * stream:与文件相关联的文件指针

例如:

1. #include<stdio.h>
2. #include<stdlib.h>
3. typedef struct S
4. {
5. char name[20];
6. int age;
7. float score;
8. }S;
9. int main()
10. {
11.     S s1={"zhangsan",23,99.2};
12.     FILE*pf=fopen("test.txt","wb");//wb是以二进制形式写入
13. if(pf==NULL)
14.     {
15. perror("fopen");
16. return 1;
17.     }
18. //写文件
19. fwrite(&s1,sizeof(s1),1,pf);
20. //关闭文件
21. fclose(pf);
22.     pf=NULL;
23. return 0;
24. }

🌸fread

fread用于向文件中读取二进制数据

fread的原型:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

void * ptr:指向要写入数据的内存首地址

size_t size:要写入数据的基本单元的字节大小

size_t count:要写数据基本单元的个数

FILE * stream:与文件相关联的指针

例如:

1. #include<stdio.h>
2. #include<stdlib.h>
3. typedef struct S
4. {
5. char name[20];
6. int age;
7. float score;
8. }S;
9. int main()
10. {
11.     S s1={0};
12.     FILE*pf=fopen("test.txt","rb");//以二进制数据读出
13. if(pf==NULL)
14.     {
15. perror("fopen");
16. return 1;
17.     }
18. //读文件
19. fread(&s1,sizeof(s1),1,pf);
20. printf("%s %d %f",s1.name,s1.age,s1.score);
21. printf("\n");
22. //关闭文件
23. fclose(pf);
24.     pf=NULL;
25. return 0;
26. }

🌸fseek

fseek用于改变文件指针指向的位置

fseek的原型:

int fseek ( FILE * stream, long int offset, int origin );

FILE * stream:与文件相关联的文件

long int offset:偏移量

int origin:起始位置

起始位置有三种选择:

SEEK_SET:文件开头

SEEK_CUR:文件的当前位置

SEEK_END;文件的末尾

🌸fteel

fteel计算文件指针指向的位置与文件开始的位置的偏移量

fteel的原型:

long int ftell ( FILE * stream );

FILE * stream :与文件相关联的指针

🌸rwind

rewind使文件指针回到文件的开始

rwind的原型:

void rewind ( FILE * stream );

FILE * stream :与文件相关联的指针

例如:

1. #include<stdio.h>
2. #include<stdlib.h>
3. int main()
4. {
5. //文件里保存的是:abcdefg
6. //文件末尾应该'\0'
7.     FILE* pf=fopen("test_1.txt","r");
8. if(pf==NULL)
9.     {
10. perror("fopen");
11. return 1;
12.     }
13. //读文件
14. int ch=fgetc(pf);//ch=a pf指向b
15. printf("%c\n",ch);
16.     ch=fgetc(pf);//ch=b pf指向c
17. printf("%c\n",ch);
18.     ch=fgetc(pf);//ch=c pf指向d
19. printf("%c\n",ch);
20. fseek(pf,-3,SEEK_CUR);//从当前位置,向左偏移3位置
21.     ch=fgetc(pf);//ch=a pf指向b
22. printf("%c\n",ch);
23. fseek(pf,3,SEEK_SET);//从开始位置,向右偏移3位置
24.     ch=fgetc(pf);//ch=d pf指向e
25. printf("%c\n",ch);
26. fseek(pf,-3,SEEK_END);//从末尾位置,向左偏移3位置
27.     ch=fgetc(pf);//ch=e pf指向f
28. printf("%c\n",ch);
29. printf("%ld\n",ftell(pf));//计算文件指针指向的位置与文件开始的位置的偏移量,这里是5
30. 
31. rewind(pf);//文件指针指向文件开始位置
32.     ch=fgetc(pf);//ch=a pf指向b
33. printf("%c\n",ch);
34. return 0;
35. }
36. 
37. 结果:
38. a
39. b
40. c
41. a
42. d
43. e
44. 5
45. a

🌸文本文件和二进制文件

文本文件:如果要求在外存上以ASCII码形式存储,以ASCII字符的形式存储的文件就是文本文件(我们能够读懂)

二进制文件:数据在内存以二进制的形式存储,如果不转换输出到外存中,就是二进制文件(二进制信息,我们还看不懂)

一个数据在内存是怎么存储的呢?

字符一律以ASCII形式存储,数值型数据即可以用ASCII形式存储,也可以使用二进制形式存储

例如:

如果整数10000,如果以ASCII码的形式输出到磁盘,则磁盘占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节

例如:

1. #include<stdio.h>
2. int main()
3. {
4.     FILE* pf=fopen("test_1.txt", "wb");
5. if(pf==NULL)
6.     {
7. perror("fopen");
8. return 1;
9.     }
10. //写文件
11. int ch=10000;
12. fwrite(&ch, sizeof(ch), 1, pf);
13. fclose(pf);
14.     pf=NULL;
15. return 0;
16. }

🌸文件结束的判定

feof的作用是:当文件读取结束的时候,判断是文件结束的原因是否是遇到文件尾结束

(1)文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)

(2)二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:

fread判断返回值是否小于实际要读的个数

fgetc函数返回值的分析:读取失败返回EOF

1.遇到文件末尾,返回EOF,同时设置一个状态,遇到文件末尾了,用feof来检测这个状态

2.遇到错误,返回EOF,同时设置一个状态,遇到错误,用ferror来检测这个状态。

feof的原型:

int feof ( FILE * stream );

FILE * stream:与文件相关的指针

返回类型为整形:如果是文件正常结束,则返回非0数,否则,返回0

例如:

1. #include<stdio.h>
2. #include<stdlib.h>
3. int main()
4. {
5. //test.txt里面是:abcdefg
6.     FILE* pf=fopen("test.txt", "r");
7. if(pf==NULL)
8.     {
9. perror("fopen");
10. return 1;
11.     }
12. //读文件
13. int ch=0;
14. while(ch=fgetc(pf)!=EOF)
15.     {
16. printf("%d\n",ch);
17.     }
18. printf("%d\n",feof(pf));
19. ferror(pf);
20. return 0;
21. }
22. 结果:
23. 1
24. 1
25. 1
26. 1
27. 1
28. 1
29. 1
30. 1

🌸文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲区文件系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。缓冲区的大小根据C编译系统决定的。

69797AC5-9536-4B2C-B420-689B3DC456B8.png

B2FA4437-E916-4D0E-87FC-5006A0ED8DAB.jpeg

证明缓冲区的存在:

1. #include<stdio.h>
2. #include <unistd.h>
3. int main()
4. {
5.     FILE* pf=fopen("test_2","w");
6. printf("休息10秒\n");
7. sleep(10);
8. fputs("abcdefg",pf);
9. fclose(pf);//关闭文件,会刷新缓冲区
10.     pf=NULL;
11. return 0;
12. }

🌸 实现拷贝一个文件

1. #include<stdio.h>
2. int main()
3. {
4.     FILE*pf=fopen("test.txt", "r");
5. if(pf==NULL)
6.     {
7. perror("fopen");
8. return 1;
9.     }
10. //拷贝文件
11.     FILE*pc=fopen("test_1.txt", "w");
12. if(pc==NULL)
13.     {
14. fclose(pf);
15.         pf=NULL;
16. perror("fopen");
17. return 1;
18.     }
19. //拷贝
20. int ch;
21. while((ch=fgetc(pf))!=EOF)
22.     {
23. fputc(ch, pc);
24.     }
25. fclose(pf);
26. fclose(pc);
27.     pf=NULL;
28.     pc=NULL;
29. return 0;
30. }

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

 

相关文章
|
6月前
|
存储 测试技术 编译器
文件操作【fopen/fclose/fputs/fgets】【C语言/进阶】
文件操作【fopen/fclose/fputs/fgets】【C语言/进阶】
67 0
|
1天前
|
存储
fread和fwirte函数
fread和fwirte函数
7 0
|
4月前
|
存储 人工智能 程序员
文件操作(一、fgets和fputs、fscanf和fprintf、fread 和 fwrite、fopen和fclose、fgetc和fputc)
文件操作(一、fgets和fputs、fscanf和fprintf、fread 和 fwrite、fopen和fclose、fgetc和fputc)
|
4月前
|
机器学习/深度学习
fprintf()函数和fwrite()函数
fprintf()函数和fwrite()函数
28 1
|
6月前
|
存储 C语言 数据安全/隐私保护
c语言文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和区别
c语言文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和区别
102 0
|
11月前
|
编译器 C++
文件操作以及相关的函数,fputc,fgetc,fputs,fgtes,fprintf,fscanf,sprintf,sscanf
🐰文件操作 🌸打开文件 🏡文件的顺序读写 🌸fputc字符输入函数(适合所有输入流) 🌸fgetc(适合所有的输出流) 🌸fputs(适合所有的输入流) 🌸fgets(适合所有的输出流) 🏡格式化的读写 🌸fprintf(适合所有的输入流) 🌸fscanf读取文件(适合所有的输出流) 🏡流 🌸屏幕这个流(stdout)输出 🏡对比:printf/fprintf/sprintf和scanf/fscanf/sscanf 🌸sprintf(把格式化数据转换成字符串) 🌸sscanf(把字符串转换成相应格式化数据)
文件的介绍,流的概念,FILE*指针函数 fgetc fputc fgetcs fputs fscanf fprintf的使用实例及说明
文件的介绍,流的概念,FILE*指针函数 fgetc fputc fgetcs fputs fscanf fprintf的使用实例及说明
96 0
|
C语言
【C 语言】文件操作 (fscanf、fprintf 函数)(一)
【C 语言】文件操作 (fscanf、fprintf 函数)(一)
127 0
【C 语言】文件操作 (fscanf、fprintf 函数)(一)
|
存储 C语言 C++
【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )(一)
【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )(一)
253 0