对文件操作自己的一点理解

1.为什么要使用文件?

我们在C语言编写过程中,一旦退出程序,且你不点击保存的话,代码也会随之消失,所以为了保存我们的代码,我们选择在文件里面敲代码,这样就可以永久化的保存我们的代码数据
在这里插入图片描述

2.文件分为哪几种?

一般来说,文件分为程序文件和数据文件。顾名思义,程序文件就是我们存放我们代码的文件,数据文件就是存放数据的文件,下面有一个图,可以帮助大家更好的了解一下

以前都是在终端(也就是键盘和显示屏)输入和输出,现在换成了从文件里面输入和输出。现在能理解了吧大家!

3.二进制文件和文本文件

我们编写的程序总归还是要存到文件里面,那么存储的方式,又有两种。一种是让数据以二进制的形式存进文件里,另一种是转化为ASCII码的形式存储进入文件
这里博主画图帮助大家理解
例如我们想存10000这个整型数据
在这里插入图片描述

4.文件的打开和关闭
那么,说完了文件的基本形式以及存储形式,我们总该打开文件才能在外面输入东西进去吧,我们总得打开文件才能从文件拿出我们想要的东西吧,那我们该如何打开和关闭文件呢

这里我们引入一个“流”的概念


我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。C语言程序对文件,画面,键盘等的数据输入输出操作都是通过流操作的。
标准流
那我为什么我们键盘输入数据,向屏幕山输出数据,并没有打开流呢?
1.stdin——标准输入流,大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
2.stdout——标准输出流,大多数大环境中输出至显示屏,printf函数就是将信息输出到标准输出流中
3.stderr——标准错误流,大多数环境中输出到显示屏界面。
这是默认打开了这三个流,我们使用scanf,printf等函数就可以直接进行输入输出操作的。
stdin,stdout等三个流的类型都是FILE * ,统称为文件指针,C语言中,就是通过如上指针来维护流的各种操作的。下面我们会对这种指针进行讲解。

5.文件指针

前面我们提到了FILE*的东西,那么这个指针具体来说就是指向文件的"文件信息区的",顾名思义,文件信息区,里面包含了文件各种各样的信息,例如,文件的具体路径,文件的类型,文件的内容,这里还是按照画图的方式帮助大家理解。
在这里插入图片描述

就像问你从冰箱里取出大象需要1.打开冰箱门2.取出大象3.关上冰箱门一样。从文件里面进行读与写的操作也是一样的。1.打开文件2.进行读与写的操作(这里需要各种函数的协助)3.关闭文件,就是这么简单,所以我们要把复杂的问题简单化.

那么下面,我们就来讲讲打开与关闭文件的操作
咱们需要先明白一件事情,我们肯定是先打开文件后,进行读与写的操作后,再关闭文件
那么这里就需要讲两个函数。

--------------- fopen(打开文件),这里需要说的是,打开文件成功就可以对文件进行操作,打开失败就会返回NULL**这里需要注意的是,打开文件后,需要说明要以哪种形式打开文件,可以是以读的形式打开(也就是从文件里面拿出我们想要的东西)也可以是以写的方式(也就是在文件里面写东西,写东西到文件里面进去),这点,是要在,打开文件的时候也要一并说明清楚的。
在这里插入图片描述

fclose(关闭文件)
这里上代码给大家示范一下

int main()
{
   FILE * pf = fopen("test.txt","w");//按照上面的表格,w的形式就是往文件里面写东西,test.txt就是文件名
   if(pf == NULL)//需要判断打开文件成功是否,失败会返回空指针
   {
      perror("fopen");//打印相关错误信息
      return 1;
   }
   //我们这里就不先对文件进行操作,下面的内容我会教大家如何操作,这里我们正常打开了文件,现在将其关闭即可
   fclose(pf);
   pf = NULL;
   return 0;
}

这就是文件打开与关闭的基本操作了

6.文件的顺序读写相关操作
这里涉及很多相关的函数,这里我就一一列举并且举例它们的用法
ps.这里的所有输入流的意思就是,既可以从键盘显示器中输入输出,也可以从文件中输入输出等等

  1. fgetc——字符输入函数——所有输入流
  2. fputc——字符输出函数——所有输出流
  3. fgets——字符输入函数——所有输入流
  4. fputs——字符输出函数——所有输入流
  5. fscanf——格式化输入函数——所有输入流
  6. fprintf——格式化输出函数——所有输出流
  7. fread——二进制输入————文件输入流(也就是只能针对文件进行操作)
  8. fwrite——二进制输出————文件输出流
    那么有同学可能就要问了,输入输出该怎么理解呢?按照惯例,我们通过画图给各位同学讲解一下
    在这里插入图片描述

接下来,我来讲解各个函数在文件中的使用

  1. fputc

输入函数,put代表放,c就是字符的占位符,所以就是往文件里面放字符
fputc(“a”,pf)"a"表示往文件里面放的什么字符,pf表示哪个文件

int main()
{
    FILE * pf = fopen("test.txt","w");//打开文件,以写的形式打开
    if(pf == NULL)
    {
       perror("fopen");
       return 1;
    }
    fputc("a",pf);//往pf指向的test.txt文件方a这个字符
    fclose(pf);
    pf==NULL;
    return 0;
}

2.fgetc

输入函数,get表示取、拿,c就是字符的占位符,所以就是从文件里面取处想要的字符
int fgetc(pf),pf表示从哪个文件里面取出,int表示取出的字符将以它的ASCII码值返回
例如

在这里插入图片描述

int main()
{
   FILE *pf = fopen("test.txt","r");//以读的形式打开文件
   //这里我就不判断pf是否为空了,往后的代码大家默认pf不为空,但是大家在写代码的时候要养成判断p是否为NULL的习惯
   
}

3.fgets

char * fgets(char * str,int num,FILE * stream)
可以看出,此函数返回char * 类型的指针,括号里面的表示从文件取出的字符串存到char * str这个指针里面,int num 就是从文件中取出多长的字符串**实际上是num-1,因为最后的字符位置要留给\0作为此字符串的结束标志,FILE * stream就是表示从哪个文件取字符串。

接下来给大家画图表示此函数各个成员的具体含义
在这里插入图片描述

int main()
{
   FILE * pf = fopen("test.txt","r");
   char arr[8] ;//定义char字符数组,用来存放从文件当中取的字符串
   fgets(arr,8,pf);
}

例如文件pf里面存放着Hello bit那么arr里面存放的字符串就是H e l l o b \0,最后一个位置留给\0,刚好八个字符,中间空白的是空白字符。.而且只能读取一行,第二行的内容是不会读取的。

5.fprintf

在讲 fprintf 的时候,咱们先来聊聊耳熟能详的 printf 函数
我们想要在屏幕上打印我们想要的内容的时候,就会用到printf函数
printf(“%s %d %lf”,arr,num,pai);把想打印的内容按照其格式打印出来,fprintf函数其实跟它很像,只不过在需要在最前面标注打印到哪个文件里面我们printf函数是打印在屏幕上,而fprintf函数则是打印在文件里面因此,fprintf函数仅支持文件流
如:fprintf(pf,“%s %d %lf”,arr,num,pai);让我们上代码

int main()
{
    FILE * pf = fopen("wenjian.c","w");
    int char arr[] = "hello bit";
    int num = 10;
    double pai = 3.14;
    fprintf(pf,"%s %d %lf",arr,num,pai);
    //所以在文件上会显示 hello bit 10 3.14
    
}

6.fscanf(FILE * stream,const char * format)
与上面的fprintf与printf函数一样,在讲fscanf函数之前,我们先来分析scanf函数的用法

假如我们要向程序中向变量中存储一些值时,就得用到scanf函数,具体用法如下

scanf(“%d %d %d”,a,b,c);

那么,fscanf函数也是一样的,只不过scanf函数是向程序中的变量去输入值,而fscanf函数则是像文件中去读取数据,假设现在文件里存放着一些变量存放的值,我们就可以依靠fscanf给它读取出来

今天的文件操作博客就讲解到这里啦!!!明天上补充内容!!

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值