[C语言]-底子知识点梳理-文件管理

[复制链接]
发表于 2026-2-4 02:05:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
媒介


  • 各位师傅们好,我是qmx_07,本日给各人讲授文件管理的相干知识,也就是常见的 读取,删除一类的使用
文件

为什么要使用文件?


  • 步调的数据是存储在电脑的内存中,如果步调退出,内存接纳,数据就丢失了
  • 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的恒久化
文件分类


  • 在步调筹划中,我们一样寻常谈的文件有两种:步调文件、数据文件(从文件功能的角度来分类的
  • 步调文件:包罗源步调⽂件(后缀为.c),⽬标⽂件(windows情况后缀为.obj),可执⾏步调(windows情况后缀为.exe)
  • 数据⽂件:⽂件的内容不⼀定是步调,⽽是步调运⾏时读写的数据,⽐如步调运⾏须要从中读取数据的⽂件,大概输出内容的⽂件
  • 文件名:⽂件路径+⽂件名主⼲+⽂件后缀
文件的打开和关闭

文件指针

1.每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相干信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是生存在⼀个结构体变量中的。该结构体范例是由体系声明的,取名FILE
2.每当打开一个文件的时间,体系会根据文件的情况主动创建一个FILE结构的变量,并添补此中的信息, 使用者不必关心细节。
3.一样寻常都是通过一个FILE的指针来维护这个FILE结构的变量,如许使用起来更加方便
  1. FILE* pf;//⽂件指针变量
复制代码

  • 界说pf是一个指向FILE范例数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就可以大概访问该文件。也就是说,通过文件指针变量可以大概找到与它关联的文件

文件的打开和关闭


  • ⽂件在读写之前应该先打开⽂件,在使⽤竣事之后应该关闭⽂件。
  • ANSIC规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件
  1. //打开⽂件
  2. FILE * fopen ( const char * filename, const char * mode );
  3. //关闭⽂件
  4. int fclose ( FILE * stream );
复制代码
mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:

代码实例
  1. #include <stdio.h>
  2. #include <errno.h>
  3. int main()
  4. {
  5.         FILE* pf = fopen("C:\\Users\\ASUS\\Desktop\\test.txt", "r");
  6.         if (pf == NULL)
  7.         {
  8.                 printf("%s\n", strerror(errno));
  9.                 return 1;
  10.         }
  11.         //读文件
  12.         //关闭文件
  13.         fclose(pf);
  14.         pf = NULL;
  15.         return 0;
  16. }
复制代码
文件的序次读写


写字符

写字符函数:
  1. int fputc ( const char * str, FILE * stream );
复制代码
代码实例:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "w");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //写文件
  13.         fputc('a', pf);
  14.         //关文件
  15.         fclose(pf);
  16.         pf = NULL;
  17.         return 0;
  18. }
复制代码
检察目次内容:

读取字符

读取字符函数原型:
  1. int fgetc ( const char * str, FILE * stream );
复制代码
代码实例:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //写文件
  13.         int ch = fgetc( pf);
  14.         printf("%c", ch);
  15.         //关文件
  16.         fclose(pf);
  17.         pf = NULL;
  18.         return 0;
  19. }
复制代码


  • 返回范例为 int 以顺应特别值 EOF,这表现失败.基于此,我们可以循环输出:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //写文件
  13.         int ch = 0;
  14.         while ((ch = fgetc(pf)) != EOF)
  15.         {
  16.                 printf("%c", ch);
  17.         }
  18.         printf("%c", ch);
  19.         //关文件
  20.         fclose(pf);
  21.         pf = NULL;
  22.         return 0;
  23. }
复制代码


写一行数据

函数原型:
  1. int fputs ( const char * str, FILE * stream );
复制代码
代码实例:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "w");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //写文件
  13.         fputs("hello", pf);
  14.         //关文件
  15.         fclose(pf);
  16.         pf = NULL;
  17.         return 0;
  18. }
复制代码


  • “w"模式会覆盖文件内容,可以实验使用"a”
  1. #include <stdio.h>
  2. #include <errno.h>
  3. int main()
  4. {
  5.         FILE* pf = fopen("test.txt", "a");
  6.         if (pf == NULL)
  7.         {
  8.                 printf("%s\n", strerror(errno));
  9.                 return 1;
  10.         }
  11.         //写一行数据
  12.         fputs("hello", pf);
  13.         fclose(pf);
  14.         pf = NULL;
  15.         return 0;
  16. }
复制代码

读取一行数据

函数原型:
  1. char * fgets ( char * str, int num, FILE * stream );
复制代码
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //读取文件
  13.         char arr[20];
  14.         fgets(arr, 5,pf);
  15.         printf("%s\n", arr);
  16.         //关文件
  17.         fclose(pf);
  18.         pf = NULL;
  19.         return 0;
  20. }
复制代码


  • 读5个数据,真正读到的才4个,另有一个’\0’
格式化输出

函数原型:
  1. int fprintf ( FILE * stream, const char * format, ... );
复制代码
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. struct S
  5. {
  6.         char arr[10];
  7.         int age;
  8.         float score;
  9. };
  10. int main()
  11. {
  12.         struct S s = { "zhangsan",25,50.5f };
  13.         FILE* pf = fopen("G:\\c_test\\test.txt", "w");
  14.         if (pf == NULL)
  15.         {
  16.                 printf("%s\n", strerror(errno));
  17.                 return 1;
  18.         }
  19.         fprintf(pf, "%s %d %f", s.arr, s.age, s.score);
  20.         //关文件
  21.         fclose(pf);
  22.         pf = NULL;
  23.         return 0;
  24. }
复制代码

格式化输入

函数原型:
  1. int fscanf ( FILE * stream, const char * format, ... );
复制代码
代码实例:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. struct S
  5. {
  6.         char arr[10];
  7.         int age;
  8.         float score;
  9. };
  10. int main()
  11. {
  12.         struct S s = { 0 };
  13.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  14.         if (pf == NULL)
  15.         {
  16.                 printf("%s\n", strerror(errno));
  17.                 return 1;
  18.         }
  19.         fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));
  20.         printf("%s %d %f", s.arr, s.age, s.score);
  21.         //关文件
  22.         fclose(pf);
  23.         pf = NULL;
  24.         return 0;
  25. }
复制代码

二进制输出

函数原型:
  1. size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
复制代码
代码实例:
  1. struct S
  2. {
  3.         char arr[10];
  4.         int age;
  5.         float score;
  6. };
  7. int main()
  8. {
  9.         struct S s = { "zhangsan",25,50.5f };
  10.         //以二进制形式写到文件中
  11.         FILE* pf = fopen("test.txt", "w");
  12.         if (pf == NULL)
  13.         {
  14.                 perror("fopen");
  15.                 return 1;
  16.         }
  17.         //二进制的方式写
  18.         fwrite(&s, sizeof(struct S), 1, pf);
  19.         fclose(pf);
  20.         pf = NULL;
  21. }
复制代码

二进制输入

函数原型:
  1. size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
复制代码
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. struct S
  4. {
  5.         char arr[10];
  6.         int age;
  7.         float score;
  8. };
  9. int main()
  10. {
  11.         struct S s = { 0};
  12.         //以二进制形式写到文件中
  13.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  14.         if (pf == NULL)
  15.         {
  16.                 perror("fopen");
  17.                 return 1;
  18.         }
  19.         //二进制的方式读取
  20.         fread(&s, sizeof(struct S), 1, pf);
  21.         printf("%s %d %f", s.arr, s.age, s.score);
  22.         fclose(pf);
  23.         pf = NULL;
  24. }
复制代码

文件随机读写


  • 随机读写:不从首个位置开始,而可以选择恣意位置
fseek

函数原型:
  1. int fseek ( FILE * stream, long int offset, int origin );
复制代码
文本内容:

代码实例:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //读文件
  13.         //定位文件指针
  14.         fseek(pf, 2, SEEK_SET);
  15.         int ch = fgetc(pf);
  16.         printf("%c\n", ch);
  17.         ch = fgetc(pf);
  18.         printf("%c\n", ch);
  19.         fclose(pf);
  20.         pf = NULL;
  21.         return 0;
  22. }
复制代码
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //读文件
  13.         //定位文件指针
  14.         fseek(pf, 2, SEEK_SET);
  15.         int ch = fgetc(pf);
  16.         printf("%c\n", ch);
  17.        
  18.         fseek(pf, 2, SEEK_CUR);
  19.         ch = fgetc(pf);
  20.         printf("%c\n", ch);
  21.         fclose(pf);
  22.         pf = NULL;
  23.         return 0;
  24. }
复制代码


  • SEEK_CUR就是在当前位置,在举行跳转
ftell

函数原型:
  1. long int ftell ( FILE * stream );
复制代码

  • 概念:返回文件指针相对于起始位置的偏移量
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //读文件
  13.         //定位文件指针
  14.         fseek(pf, 2, SEEK_SET);
  15.         int ch = fgetc(pf);
  16.         printf("%c\n", ch);
  17.         printf("%d\n", ftell(pf));//3
  18.         //fseek(pf, 2, SEEK_CUR);
  19.         fseek(pf, -1, SEEK_END);
  20.         ch = fgetc(pf);
  21.         printf("%c\n", ch);
  22.         printf("%d\n", ftell(pf));//6
  23.         fclose(pf);
  24.         pf = NULL;
  25.         return 0;
  26. }
复制代码

rewind

函数原型:
void rewind ( FILE * stream );

  • 概念:返回到文件起始位置
代码实例:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <errno.h>
  4. int main()
  5. {
  6.         FILE* pf = fopen("G:\\c_test\\test.txt", "r");
  7.         if (pf == NULL)
  8.         {
  9.                 printf("%s\n", strerror(errno));
  10.                 return 1;
  11.         }
  12.         //读文件
  13.         //定位文件指针
  14.         fseek(pf, 2, SEEK_SET);
  15.         int ch = fgetc(pf);
  16.         printf("%c\n", ch);
  17.         rewind(pf);
  18.         ch = fgetc(pf);
  19.         printf("%c\n", ch);
  20.         fclose(pf);
  21.         pf = NULL;
  22.         return 0;
  23. }
复制代码

文本文件和二进制文件


  • 根据数据的构造情势,数据⽂件被称为⽂本⽂件大概⼆进制⽂件。
  • 数据在内存中以⼆进制的情势存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
  • 如果要求在外存上以ASCII码的情势存储,则须要在存储前转换。以ASCII字符的情势存储的⽂件就是⽂本⽂件。
  • ⼀个数据在⽂件中是怎么存储的呢?
  • 字符⼀律以ASCII情势存储,数值型数据既可以⽤ASCII情势存储,也可以使⽤⼆进制情势存储

文件读取和竣事的判断


  • 牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否竣事
  • 而是应用于当文件读取竣事的时间,判断是读取失败竣事,还是碰到文件尾竣事
文本文件读取是否竣事,判断返回值是否为 EOF ( fgetc ),大概 NULL ( fgets)
比方:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL

  • 二进制文件的读取竣事判断,判断返回值是否小于现实要读的个数。比方:
    fread判断返回值是否小于现实要读的个数。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5.     int c; // 注意:int,非char,要求处理EOF
  6.     FILE* fp = fopen("test.txt", "r");
  7.     if(!fp) {
  8.         perror("File opening failed");
  9.         return EXIT_FAILURE;
  10.     }
  11. //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
  12.     while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
  13.     {
  14.         putchar(c);
  15.     }
  16.     //判断是什么原因结束的
  17.     if (ferror(fp))
  18.         puts("I/O error when reading");
  19.     else if (feof(fp))
  20.         puts("End of file reached successfully");
  21.     fclose(fp);
  22. }
复制代码
文件缓冲区

ANSIC 尺度采取“缓冲文件体系”处置处罚的数据文件的,所谓缓冲文件体系是指体系主动地在内存中为步调中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向盘算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到步调数据区(步调变量等)。缓冲区的巨细根据C编译体系决定的。


  • 由于有缓冲区的存在,C语言在使用文件的时间,须要做革新缓冲区大概在文件使用竣事的时间关闭文 件。如果不做,大概导致读写文件的题目。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表