前言:
欢迎各位童学来到本文,本文将主要通过一个实战案例(奥运会奖牌)来帮助各位小伙伴们熟悉并掌握文件的相关操作,相信经过一个实战案例的小项目后大家对文件的相关操作应该都能够轻车熟路了!
🐳目录
- 🐳文件简介
- 🐳文件的相关函数
- 🐳实例演示
- 🐳Code:
- 🐳留在最后
🐳文件简介
当程序结束时,内存中的数据就会丢失,这样每次运行程序时都要重新输入数据。那么有没有可以长久保存数据的方法呢?当然是有的啦!这个方法就是使用文件操作,用文件保存键盘输入和屏幕输出的数据,将数据以文件的形式存放在光盘、磁盘等外存储器上,可达到重复使用、永久保存数据的目的。
与计算机内存存储数据不同的是,文件操作使用硬盘或U盘等永久性的外部存储设备来存储数据。这样保存的数据在程序结束时不会丢失。而我们程序员不必关心这些复杂的存储设备是如何存取数据的,因为操作系统已经把这些复杂的存取方法抽象为了文件(File)。文件是由文件名来识别的,因此只要指明文件名,就可读出或写入数据。只要文件不同名,就不会发生冲突。
C语言文件有两种类型:文本文件(也称ASCII文件)和二进制文件。其差别在于存储数值型数据的方式不同。在二进制文件中,数值型数据是以二进制形式存储的;而在文本文件中,则是将数值型数据的每一位数字作为一个字符以其ASCII码的形式存储的。因此,文本文件中的每一位数字都单独占用一个字节的储存空间。而二进制文件则是把整个数字作为一个二进制数来存储的,并非数值的每一位数字都占用单独的储存空间。
过多的知识点就不在这里一一赘述了哈,大家应该也不太想看这种理论性的东西,我也不乐意讲哈哈!毕竟,实战才是提升的最快方法。
以上内容如有错误的地方,欢迎在评论区指出哦也可私信我!谢谢!
🐳文件的相关函数
- 函数 fopen() 用来打开文件,其函数原型为:
FILE *fopen(const char *filename,const char *mode);
fopen()的返回值是一个文件指针(File Pointer),FILE是在stdio.h中定义的结构体类型,封装了与文件有关的信息,如文件句柄、位置指针以及缓冲区等。fopen()有两个形参第1个形参filename表示文件名,可包含路径和文件名两部分,第2个形参mode表示文件打开方式,其取值如表13-1所示:
如:fp = fopen(“D:\demo.txt”,“a+”);
注意,不能写成: fp = fopen(“D:\demo.txt”,“a+”); - 因为操作系统对于同时打开的文件数目是有限制的,所以在文件使用结束后必须关闭文件,否则会出现意想不到的错误。在C语言中,函数fclose()用来关闭一个由函数fopen()打开的文件。其函数原型如下:
——————————————————— int fclose(FILE fp); - 函数fgetc()用于从一个以只读或读写方式打开的文件上读字符 其函数原型为:
——————————int fgetc(FILE fp) - 函数fputc()用于将一个字符写到一个文件上 fputc()的函数原型为:
——————————————————————int fputc(int c,FILE fp); - 函数feof()用于检查是否达到文件末尾,当文件位置指针指向文件结束符(Ende-of-file Indicator)时,返回非0值,否则返回0值。 其函数原型为:
————————————————————————————int feof(FILE fp) - 函数fscanf()用于按指定格式从文件读数据 其函数原型为:
——————————————————————int fscanf(FILE fp,const char format,…)
其中,第1个参数为文件指针,第2个参数为格式控制参数,第3个参数为地址参数表列,后两个参数和返回值与函数scanf()相同。 - 函数fprintf()用于按指定格式向文件写数据 其函数原型为:
——————————————————int fprintf(FILE fp,const char format,…)
其中,第1个参数为文件指针,第2个参数为格式控制参数,第3个参数为输出参数表列,后两个参数和返回值与printf()相同。
🐳实例演示
本实例是将数个国家的名称以及获得的奖牌数量输入到第一个文本中 (我们暂且称之为文本A) ,然后再从文本A中读取各个国家的信息,按奖牌数量降序排序,然后将排好序的信息写入第二个文本当中 (我们暂且称之为文本B) 。
🐳Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<bits/stdc++.h>
using namespace std;
struct node
{
char name[101];
int num;
}stu1[101],stu2[101],stu3;
bool cmp(node a,node b)
{
return a.num>b.num;
}
int main()
{
FILE *fp,*fd;
fp=fopen("C:\\Users\\洛心恒\\Desktop\\A.txt","w");
int n;
scanf("%d",&n);
if(fp==NULL)
{
printf("wrong!");
return 0;
}
else
{
for(int i=0;i<n;i++)
{
scanf("%s %d",stu1[i].name,&stu1[i].num);
if(i!=n-1)
fprintf(fp,"%s %d\n",stu1[i].name,stu1[i].num);
else
fprintf(fp,"%s %d",stu1[i].name,stu1[i].num);
}
fclose(fp);
}
char a[101];
int c;
fp=fopen("C:\\Users\\洛心恒\\Desktop\\A.txt","r");
for(int i=0;i<n;i++)
{
fscanf(fp,"%s %d\n",a,&c);
strcpy(stu2[i].name,a);
stu2[i].num=c;
}
sort(stu2,stu2+n,cmp);
fclose(fp);
fd=fopen("C:\\Users\\洛心恒\\Desktop\\B.txt","w");
for(int i=0;i<n;i++)
{
fprintf(fd,"%s %d\n",stu2[i].name,stu2[i].num);
}
fclose(fd);
}
首先在控制台输入国家个数,然后依次输入每个国家的名称以及奖牌个数。
以下各国家奖牌数量为博主乱输入的哈,切莫当真呢!
然后打开我们的文本A,能够看见我们输入的数据存进了我们的文本A
最后打开我们的文本B,可以看到文本B内的内容就是我们按排序后的结果啦!
🐳留在最后
OK,咋们本期的内容就到这里啦,文件的相关操作是不是很简单呢,真的十分钟就能搞定呢,我没骗你吧😉😉😉,如果还有疑问的小伙伴可以评论区留言哦!看到了的话我都们一一进行耐心解答哒,最后祝大家天天开心,代码手到擒来 。
那我们下期再见✌️✌️✌️