目录

一. 为什么使用文件:

二. 什么是文件:

2.1 程序文件:

2.2 数据文件:

2.3 文件名 :

三. 文件的打开和关闭:

3.1 文件指针 :

3.2 文件的打开和关闭:

四. 文件的顺序读写:

4.1 对比一组函数:


一. 为什么使用文件:

       我们前面学习 结构体 时,写了 通讯录 的程序,当通讯录 运行 起来的时候,可以给通讯录中 增加、删除数据 ,此时 数据 是存放在 内存
中,当 程序退出 的时候, 内存中的数据就会被回收 ,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得 重新录
入 ,如果使用这样的通讯录就很难受。我们在想既然是通讯录就 应该把信息记录下来 ,只有我们自己选择删除数据的时候,数据才不复存
在。 这就涉及到了 数据持久化 的问题,我们一般 数据持久化 的方法有,把 数据 存放在 磁盘文件 、存放到 数据库 等方式,使用 文件 我们可以
将数据直接存放在电脑的 硬盘 上,电脑 硬盘中的数据不会被回收 ,而会一直被保留下来,做到了 数据的持久化 。

二. 什么是文件:

磁盘(硬盘)、桌面 上的 文件 是 文件。
但是在程序设计中,我们一般谈的文件有 两种 : 程序文件、数据文件(从 文件功能 的角度来分类的)。

2.1 程序文件:

包括 源程序文件(后缀为.c) , 目标文件(windows环境后缀为.obj,程序在编译时产生的临时文件), 可执行程序(windows环境后缀
为.exe),      .bat 文件是一种处理脚本,只要是和程序有关,通过写代码来完成的,都可以认为是程序文件、

2.2 数据文件:

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本章讨论的是数

据文件,在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。 其实有时候我们

会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

2.3 文件名

一个文件要有一个 唯一的文件标识 ,以便用户 识别和引用 。 文件名 包含 3部分 : 文件路径+文件名主干+文件后缀、
例如: c:\code\   test   .txt    —— 绝对路径 ,, 为了方便起见, 文件标识 常被称为 文件名。
在操作文件的时候,可以写成 绝对路径 ,也可以写成 相对路径 、

三. 文件的打开和关闭:

3.1 文件指针 :

缓冲文件系统中 ,关键的概念是 “文件类型指针” ,简称 “文件指针”。
每个 被使用的文件 都在 内存 中开辟了一个相应的 文件信息区 ,用来 存放文件的相关信息 (如文件的名字,文件状态及文件当前的位置
等)。 这些信息是保存在一个 结构体变量 中的。该 结构体类型 是由系统声明的,取名 FILE.
例如,VS2013编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
struct _iobuf{//文件信息区中记录的相关信息、char *_ptr;int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};typedef struct _iobuf  FILE; //重命名
不同的 编译器下的 FILE类型 包含的内容 不完全相同,但是大同小异。
每当打开一个 文件 的时候,系统会根据 文件 的情况自动创建一个 FILE结构的变量 。即 文件信息区 ,该 文件信息区与文件关联起来 ,只要该
文件发生变化,此时文件信息区中的内容就跟着发生变化,并填充其中的信息, 不需要关心细节。

一般都是通过一个 FILE类型的指针 来维护这个 FILE类型的结构体变量 ,这样使用起来更加方便。
下面我们可以创建一个 FILE*类型 的 指针变量 :
FILE* pf;//文件指针变量
定义 文件指针变量pf 是一个指向 FILE 类型数据的 指针变量 。可以使 pf 指向某个文件的 文件信息区(是一个结构体变量)。 通过该文件信息区
中的信息就能够 访问该文件 。也就是说, 通过文件指针变量能够找到与它关联的文件。
比如:

3.2 文件的打开和关闭:

FILE * fopen ( const char * filename, const char * mode );

当使用fopen函数来成功打开某一个文件的时候,它会自动创建一个文件信息区,并把该文件信息区的起始位置的地址返回去,如果打开失

败,就会返回一个空指针NULL,该函数第一个参数是传文件名,第二个参数是选择打开方式、

其中:

" r ",只读,如果该文件不存在或者没被找到的话就会打开错误,返回一个空指针NULL,

" w ",写文件,如果该文件已经存在,该文件中的内容就会被销毁,相当于打开一个空文件,重新进行书写,如果不存在该文件,就会自

动创建一个新的文件,再进行书写、

" a ",在原有的文件末尾追加内容、如果文件不存在,则会新建一个文件,再进行书写、

其中,关闭文件的函数是fclose函数,使用规则为:

int fclose ( FILE * stream );
//和动态内存开辟中释放内存空间的函数free的使用规则类似。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//文件拓展名要记得放出来、//FILE* pf = fopen("test.dat", "r");//如果只写出文件名主干和后缀,这就是相对路径,他默认该路径就是和本次项目的工程和代码文件在同一个目录下文件、//FILE* pf = fopen("D:\2021代码code\Project150\test.dat", "r");//如果指定出来了具体的路径,则就是绝对路径, 表示的就是该绝对路径下的文件、//但是如果按照绝对路径直接执行代码,也是不行的,因为其中会存在转义字符,所以要避免转义字符的出现,对其进行改造、则有:FILE* pf = fopen("D:\\2021代码code\\Project150\\test.dat", "r");//加上\,来防止转义//以 写 的形式打开文件的时候,如果该文件不存在,则会重新创建一个新的文件并进行书写、if (pf == NULL){//打开文件失败perror("fopen");return 1;}else{//打开文件成功}//关闭文件fclose(pf);pf = NULL;//一个程序中,能够打开文件的数量是有限的,如果文件只打开不释放,那么后面就不能再打开文件了、return 0;
}
文件在读写之前应该先 打开文件 ,在使用结束之后应该 关闭文件、
在编写程序的时候,在 打开文件的同时 ,都会返回一个 FILE*的指针变量 指向该文件,也相当于建立了 指针和文件 的关系。
ANSIC 规定 使用fopen函数来打开文件 , fclose来关闭文件、
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );

打开方式如下:

四. 文件的顺序读写:

fputc函数:

int fputc ( int character, FILE * stream );

写入/输出一个字符,功能:写一个字符到一个流(文件流,磁盘(硬盘))里,或者写一个字符到一个流(标准输出流,stdout,即

打印到屏幕上去)第一个参数是某一个字符的ASCII码值、第二个参数就是指针指向的某一个流。

一、写一个字符到一个流(文件流,磁盘(硬盘))里面:相当于以 %c 进行打印、去掉强制类型转换,笔误、

现在该文件内就有了内容,如果再以" w "的形式去写,但是不写任何内容,对于该打开方式来说,如果已经存在文件,就会把其中的

内容销毁掉、但由于不写入任何数据,所以该文件中就不存在内容了。

二、写一个字符到一个流(标准输出流,stdout,即打印到屏幕上去),还是相当于以 %c 的形式进行打印、

fgetc函数:

int fgetc ( FILE * stream );

从流里面读取一个字符,可以从文件流(磁盘(硬盘)),也可以从标准输入流stdin中读取,该函数的返回值即读取到的字符的

ASCII码值,如果读取失败或者遇到文件结束,则返回的是EOF(-1):

一、从文件流(磁盘(硬盘)),中读取一个字符、相当于以 %c 进行读取,能够读取到空白字符。去掉强制类型转换,笔误、

注意:

在记事本(文件)中点回车,这个回车在此情况下是能当做回车读取进去的、

从流里面读取一个字符,可以从文件流,也可以从标准输入流stdin中读取,该函数的返回值即读取到的字符的ASCII码值,如果读取

失败或者遇到文件结束,则返回的是EOF:遇到文件结束的话,就会返回EOF,即:-1:

二、从标准输入流stdin中读取一个字符:相当于以 %c 进行读取,能够读取空白字符、

读取3个字符,如果输入ab敲回车,和scanf函数类似,在缓冲区内有:ab\n,最后的字符\n会被认为是一个转义字符,即换行, 因为

以%c读取字符的时候,能读取到空白字符、

如果输入a敲回车,在缓冲区内有:a\n,, 前两个fgetc函数就能读取到这两个字符,再打印出来第一个字符a,然后再打印出换行,

但是此时还有一个fgetc函数没有读取到数据,所以会等待你再输入数据,如果再输入b敲回车,,在缓冲区内就有b\n,,但是,只剩

下了一个fgetc函数,只能读取到一个字符,即读取到字符b,然后打印在屏幕上,程序结束。

fputs函数:写入/输出一行、

int fputs ( const char * str, FILE * stream );

写入/输出一个字符串到一个流(文件流,磁盘(硬盘)),或者写一个字符串到一个流(标准输出流,stdout,即打印到屏幕上

去)、相当于以 %s 打印,只把字符\0前面的内容打印出来:都是以文本的方式写进去,,以ASCII码值的形式写入:

一、写入/输出一个字符串到一个流(文件流,磁盘(硬盘))、相当于以 %s 打印,只把字符\0前面的内容打印出来、

1、去掉强制类型转换,笔误、

2、去掉强制类型转换,笔误、

二、写入/输出一个字符串到一个流(标准输出流,stdout,即打印到屏幕上去),相当于以 %s 打印,只把字符\0前面的内容打印出

来、

fgets函数:

char * fgets ( char * str, int num, FILE * stream );

从流里面读取一个字符串,可以从文件流(磁盘(硬盘)),也可以从标准输入流stdin中读取,其中,num代表能够读取到的最多的

字符个数,假设num等于n,,但实际上就读取出来了n-1个字符,,还要留个位置给字符\0、第一个参数是把读出来的字符串放到字

符指针变量str所指的空间中去、该函数的返回值为放置读取出来的字符串的字符数组的首元素的地址、

一、从文件流(磁盘(硬盘))中读取一个字符串,按照 %c 进行读取,能够读取空白字符、

在记事本(文件)中点回车,这个回车是部分情况下不能当做回车读取进去的,不需要研究这个,除此之外,在终端输入时点回车,

在缓冲区内才会有字符\n,会被当做回车处理。去掉强制类型转换,笔误、

二、从标准输入流stdin中读取一个字符串,按照 %c 进行读取,能够读取空白字符、

1、

2、

3、

格式化输出函数:

格式化的数据,即具有一定格式的数据,并不是特指结构体数据,只是结构体成员变量中能够存放不同类型,即不同格式的数据,更

加丰满一些,但不代表只有结构体数据才称得上是格式化数据,像单单一个int整型,比如整型数字5,它也具有一定的格式,也称作

格式化数据、

int printf ( const char * format, ... );
//...代表的是可变参数,参数的个数是可以发生变化的,,format代表的是格式、int fprintf ( FILE * stream, const char * format, ... );
//用法类似与printf,,把流传过去就行了、

格式化输入函数:

格式化的数据,即具有一定格式的数据,并不是特指结构体数据,只是结构体成员变量中能够存放不同类型,即不同格式的数据,更

加丰满一些,但不代表只有结构体数据才称得上是格式化数据,像单单一个int整型,比如整型数字5,它也具有一定的格式,也称作

格式化数据、

int scanf  (                const char * format, ... );
int fscanf ( FILE * stream, const char * format, ... );

以上所有都是以文本形式进行写入/读取 文件的,以ASCII码值进行写入/读取、

二进制输出:适用于结构体、

以二进制方式进行 写入/读取 文件、

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

写数据到一个流里面去, 无具体类型的指针变量ptr是要写的数据的地址,size是要写的数据的元素的大小,单位是字节,count是指

的元素个数最大值、

由于在记事本中,都是文本的形式展示的,但是以二进制的形式写入的数据,如果使用记事本进行展示的话,会把以二进制形式写进

去的数据再以文本形式展示出来,这样是看不懂的,是乱码, 但是,字符串和字符以二进制的形式写入和以文本的形式写入内容是一

样的,本质上都是存储的每个字符的ASCII码值,其他类型的数据,是不一样的、

二进制输入:适用于结构体、

对于fread函数来说的话,他就是以二进制的形式进行 读取/输入 的,该函数能够看懂二进制形式写进去的数据、

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

fwrite函数和fread函数是一对,二进制形式写入,二进制形式读取。

4.1 对比一组函数:

1、scanf:输入型函数,指定一定的格式输入,比如:%d,%s,%c等,针对标准输入(键盘)的格式化的输入语句,所谓格式化的

输入语句,即按照一定的格式进行输入,针对的是:stdin、

2、fscanf:可以针对标准输入流,也可以针对文件流,适用于所有输入流的格式化输入语句、—— stdin、文件等、

3、sscanf:从一个字符串中读取格式化的数据,即读取具有一定格式的数据、

int sscanf ( const char * s, const char * format, ...);
//从一个字符串中读取格式化的数据,字符指针变量s指向了该字符串首字符的地址,即从字符指针变量s所指的字符串中读取格式化的数据,剩下的参数的使用方法和scanf函数是一样的、
//相当于把一个字符串中的数据转换成格式化的数据,即有格式的数据、int scanf  (                 const char * format, ...);

比如:

1、printf:输出型函数,指定一定的格式输出,比如:%d,%s,%c等,针对标准输出(屏幕)的格式化输出语句,针对的是:

stdout、

2、fprintf:可以针对标准输出流,也可以针对文件流,适用于所有输出流的格式化输出语句、—— stdout、文件等、

3、sprintf:把格式化的数据,即具有一定格式的数据,  转换为一个字符串、

int sprintf ( char * str, const char * format, ... );
//写格式化的数据到一个字符串中,字符指针变量str指向了该字符串首字符的地址,即把格式化的数据写到字符指针变量str所指的字符串中,剩下的参数的使用方法和printf函数是一样的、
//相当于把格式化的数据,即有格式的数据转换成一个字符串、int printf (              const char * format, ... );

比如:

格式化的数据,即具有一定格式的数据,并不是特指结构体数据,只是结构体成员变量中能够存放不同类型,即不同格式的数据,更

加丰满一些,但不代表只有结构体数据才称得上是格式化数据,像单单一个int整型,比如整型数字5,它也具有一定的格式,也称作

格式化数据、

今天的分享到此为止,下面的内容会陆续更新,谢谢大家~

C语言文件操作(1)相关推荐

  1. C语言文件操作解析(二)【转载】

    http://www.cnblogs.com/dolphin0520/archive/2011/10/05/2199598.html C语言文件操作解析(二) C语言中对文件进行操作必须首先打开文件, ...

  2. C语言文件操作解析(二)

    C语言文件操作解析(二) C语言中对文件进行操作必须首先打开文件,打开文件主要涉及到fopen函数.fopen函数的原型为 FILE* fopen(const char *path,const cha ...

  3. C语言文件操作函数大全(看到总结的真的很好,就转载贡献给大家了)

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * st ...

  4. c语言计算文件摘要值,c语言文件操作摘要.ppt

    c语言文件操作摘要 第十章 文件 10.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件处理方法 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区 非 ...

  5. C语言文件操作解析(一)

    C语言文件操作解析(一) 在讨论C语言文件操作之前,先了解一下与文件相关的东西. 一.文本文件和二进制文件 文本文件的定义:由若干行字符构成的计算机文件,存在于计算机系统中.文本文件只能存储文件中的有 ...

  6. c语言全文件操作函数,C语言文件操作函数大全

    C语言 文件操作函数大全 C语言文件操作函数 2007-10-17 19:21 13.1C语言文件 1,两种文件存取方式(输入,输出方式) 顺序存取 直接存取 2,数据的两种存放形式 文本文件 二进制 ...

  7. C语言文件英文,c语言文件操作(国外英文资料).doc

    c语言文件操作(国外英文资料) 韧仔欠鳖佳刀寺男拒姚友畔庶炳告舞漾容验熬销避暇庆茅奠哑栓障于筏茸兔厘万寿日击悯汤糠毛塞丈河汤忧寸绞忧择曹酪泛磋牵卧国叛株咙麓独檀烈钎熬酪夫栓线夹蔗屏矾疙陋柱狂茅悬匈队八 ...

  8. 基于存储的C语言文件操作常规问题分析(文本文件与二进制文件)

    基于存储的C语言文件操作常规问题分析(文本文件与二进制文件) 问题描述 文本文件与二进制文件 数据写入文本乱码问题 fopen和open 流式文件操作常用函数 直接I/O文件操作常用函数 问题描述 我 ...

  9. c语言创建文件存放,C语言文件操作

    C语言文件操作 常见硬件设备所对应的文件 文件 硬件设备 stdin 标准输入文件,一般指键盘:scanf().getchar() 等函数默认从 stdin 获取输入. stdout 标准输出文件,一 ...

  10. ❤️学懂C语言文件操作读这篇就够了(万字总结,附习题)❤️

    目录 ​​​ 一,写在前面 二,为什么使用文件 1,原因 2,数据流 3,缓冲区(Buffer) 4,C语言中带缓冲区的文件处理 5,文件类型 6,文件存取方式 三,什么是文件 1,程序文件 2,数据 ...

最新文章

  1. Django的模板继承
  2. ML之LoR:基于LoR(逻辑回归)算法对乳腺癌肿瘤(9+1)进行二分类预测(良/恶性)
  3. CodeForces - 1313B Different Rules(数学+思维)
  4. linux 命令整理(持续更新)
  5. 20220208--CTF MISC-- BUUCTF--二维码 1--binwalk-john-(工具的使用:分析文件/暴力破解压缩包密码)
  6. 2011股市大方向随想
  7. Springboot 添加server.servlet.context-path
  8. Tips--Solidworks 2016绘制工程图时显示gtol.sym文件缺失的解决方法
  9. NetStatusEvent info对象的状态或错误情况的属性
  10. MySQL数据库检查修复详解
  11. html浅色_html文本字体浅色
  12. 模拟集成电路大牛的经验
  13. 搜狗微信添加搜索工具爬虫
  14. php 逻辑思维题,倘若3分钟内,你能答对这道智力题,说明你的逻辑思维能力很强...
  15. 那些破事儿.........
  16. 根据地址返回经纬度 java_java 根据地址返回经纬度
  17. 水洼数 DFS 蓝桥杯 java代码
  18. 单片机消抖c语言程序,基于单片机定时器软件消抖C51程序研究
  19. xftp无法连接到虚拟机
  20. JDK源码分析 FutureTask源码分析

热门文章

  1. C语言实现“勾股树”——毕达哥拉斯树
  2. 秒杀系统的页面静态化
  3. html后代选择器简单代码,css:not(),选择器和选择后代
  4. Win10Ubuntu双系统安装教程
  5. 兄弟连IT教育-九年的发展!
  6. 接上宽带路由器不能拨号
  7. 【reID学习记录】Person_reID_baseline_pytorch学习
  8. Oracle数据库,建库建表
  9. 多源数据融合 Sar Optical(一)像素级融合
  10. linux文件中的^M