首页 > 其他分享 >C语言文件操作

C语言文件操作

时间:2024-06-02 22:00:19浏览次数:41  
标签:文件 函数 输出 读写 C语言 FILE 操作 指针

一.文件的先关知识

1.1 什么是文件?                                                                                                  

磁盘上的文件是文件,在程序设计的时候,我们一般将文件分为两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)。

程序文件是什么?

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。

数据文件是什么?

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。

1.2文件名

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。

⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀

例如: c:\code\test.txt                   为了⽅便起⻅,⽂件标识常被称为⽂件名

1.3流(stream)

那么什么是流呢?

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。 C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

文件流是通过文件指针来实现的,文件指针负责跟踪文件的当前位置,而文件流则提供了一种方便的方式来读取和写入文件。

标准流

• stdin-标准输⼊流

• stdout-标准输出流

• stderr-标准错误流

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

1.4文件缓冲区

从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂ 件。 如果不做,可能导致读写⽂件的问题。

1.5文件指针

缓冲⽂件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

在不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。

我们可以创建一个文件指针变量

FILE* pf;//⽂件指针变量
 

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变 量)。通过该⽂件信息区中的信息就能够访问该⽂件。总之  通过文件指针变量能够间接找到与它关联的文件。

二.文件的打开与关闭

2.1文件的打开

在ANSIC规定使⽤中 fopen 函数用来打开⽂件

FILE * fopen ( const char * filename, const char * mode );// 打开⽂件

mode文件打开的模式

文件使用方式含义如果指定文件不存在
“r”(只写)为了输⼊数据,打开⼀个已经存在的文本⽂件出错
“w”(只写)为了输出数据,打开⼀个⽂本⽂件重新建立一个文件夹
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件出错
“w+”(读写)为了读和写,建议⼀个新的⽂件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件出错
“wb+”(读 写)为了读和写,新建⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读 写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

2.2文件的关闭

int fclose ( FILE * stream );// 关闭⽂件

只要有文件的打开的同时,必定有文件的关闭,这两者是同时存在的

三.文件的顺序读写

3.1顺序读写函数的介绍

函数名功能适用于
fgetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输出流
fgets文本行输入函数所有输⼊流
fputs文本行输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数所有输出流
fread二进制输入文件
fwrite二进制输出文件

上⾯表格说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流一般指适⽤于标准输出流和其他输出流(如⽂件输出流)。

fgetc和fputc

fgetc是从流中获取字符(Fgetc和getc是等价的,除了getc可以在某些库中作为宏实现。)

fputs则是将一个字符写入流并推进位置指示器。

fgets和fputs

fgets从流中获取字符串并将其作为C字符串存储到str中,直到读取(num-1)个字符,或者到达换行符或文件结束符,以先发生的为准。(注意,fgets与gets有很大的不同:fgets不仅接受流参数,而且允许指定str的最大长度,并在字符串中包含任何结束换行符。)
fputs将字符串写入流函数从指定的地址(str)开始复制,直到到达结束的空字符('\0')。这个终止的空字符不会复制到流中。(注意,fputs与puts的不同之处不仅在于可以指定目标流,而且fputs不会写入额外的字符,而puts会自动在末尾附加一个换行符。)

fscanf和fprintf

将这两个函数之间类型和scanf以及printf进行比较:可以发现都是多了FILE*stream,多了一个流,需要通过流来实现前两个函数的作用

fread和fwrite

fread从流中读取数据块 ptr指读取内存块的位置 size指每个元素的大小(大小为字节)count指需要读取的数量 stream指指向FILE对象的指针,其中包含要读取数据的文件。

fwrite将数据块写入流 ptr指写入内存块的位置 size指每个元素的大小(大小为字节)count指需要写入的数量 stream指指向FILE对象的指针,其中包含要写入数据的文件。

以上就是顺序读写函数的介绍,如有错误各位大佬评论区指出

四.文件的随机读写

4.1fseek

根据文件指针的位置和偏移量来定位文件指针

重新定位流位置指示器
将与流关联的位置指示器设置为新位置。

4.2ftell

返回文件指针相对于起始位置的偏移量

获取流中的当前位置
返回流的位置指示器的当前值。

4.3rewind

让⽂件指针的位置回到文件的起始位置

设置流的起始位置
将与流关联的位置指示器设置为文件的开头。

五.文件读取的判定

5.1被错误使⽤的 feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

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

例如: • fgetc 判断是否为 EOF .

            • fgets 判断返回值是否为 NULL

2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

例如:

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

标签:文件,函数,输出,读写,C语言,FILE,操作,指针
From: https://blog.csdn.net/ZWW_zhangww/article/details/139395363

相关文章

  • 自动化办公02 用openpyxl库操作excel.xlsx文件(新版本)
    目录一、文件读操作二、文件写操作三、修改单元格样式openpyxl是一个处理Excel表格的第三方库。openpyxl库可以处理Excel2010以后的电子表格格式,包括:xlsx/xlsm/xltx/xltm。openpyxl教程一、文件读操作工作簿(workbook):excel文件工作表(worksheet):工作簿中的每......
  • 成功解决:OSError: [WinError 1455] 页面文件太小,无法完成操作。
    出现问题的原因:虚拟内存不足无法完成操作只需要把所在盘的虚拟内存扩大就好啦1.搜索高级系统设置2.点击高级,再点击设置3.点击高级4.更改虚拟内存5.我的在D盘所以改的是D盘的虚拟内存大小点击自定义大小6.将值改成10240,两个都是问题成功解决......
  • 【C语言项目实战】使用单链表实现通讯录
                                                                  ......
  • CentOS7单用户模式,救援模式操作记录
    CentOS7单用户模式,救援模式操作记录1.单用户模式单用户模式进入不需要密码,无网络连接,拥有root权限,禁止远程登陆。一般用于用于系统维护,例如忘记root密码后可以通过进入单用户模式进行重置。开机启动,在出现内核选项时按"键盘e键"进行编辑,找到linux16行并在行尾添加内核参数rd.......
  • U-boot、linux内核、根文件系统移植以及程序
    终于这几天把这个移植的流程过了一遍,所以特此回来总结。U-boot移植首先是U-boot移植。Linux系统要启动就必须需要一个bootloader程序,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NORFLASH,SD,MMC等)拷......
  • JSAPI:DOM操作
    DOM操作WebAPIAPI:预定好的函数例如:alert(),console.log(),prompt()WebAPI:浏览器提供的一套操作浏览器功能和页面元素的API(BOM,DOM),DOM的顶级对象是documentBOM的顶级对象是window节点:页面中的所有内容都是节点(标签,属性,注释,文本)获取元素的方法document.getElementBy......
  • PsInfo工具的基本功能和应用技巧,能够在系统管理中灵活运用PsInfo工具进行系统信息收集
    PsInfo初级应用的大纲:1.PsInfo基础知识介绍PsInfo工具:了解PsInfo的作用和功能,以及在系统管理中的重要性。安装和配置:学习如何获取和配置PsInfo工具,以便在系统中进行基本的信息收集和分析。2.系统信息展示系统基本信息:使用PsInfo命令展示系统的基本信息,如操作系统版本、......
  • 借助AI大模型,三分钟原创一部儿童故事短视频(附完整操作步骤)
    前面文章的介绍,我们可以通过在自己笔记本电脑上部署的Llama3大模型生成文章、文本润色、生成摘要等。今天我们更进一步,在文本的基础上,快速制作一部儿童故事短视频,且可根据自己需要完全原创……前提:有AI大模型对话机器人第一种方式(推荐),可参考前面文章,自己部署大模型,深入体......
  • 微软云计算之云计算平台、云操作系统Windows Azure
    微软云计算平台微软云计算平台微软的云计算技术WindowsAzure组成微软云操作系统WindowsAzureWindowsAzure概述WindowsAzure计算服务WindowsAzure存储服务全局命名空间体系架构存储域的层次结构双复制引擎文件流层分区层WindowsAzureConnectWindowsAzureCDNFab......
  • 如何轻松实现两个List的高效交集操作
    哈喽,大家好,我是木头左!一、引言在编程的世界里,总是在寻找更高效、更简洁的方法来解决问题。今天,将探讨如何在Java中轻松实现两个List的交集操作,让你的代码更加简洁、高效。二、JavaList简介让了解一下Java中的List接口。List是一个有序的集合,可以包含重复的元素。它提供了一......