C语言文件操作基本方法

1、文件的分类

ANSI C 的缓冲文件系统

  • 缓冲文件系统
    缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。
    从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。
    从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。
  • 非缓冲文件系统
    是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区
    C的“缓冲文件系统”自动地在内存中开辟一个文件缓冲区, 在对文件进行处理时, 通过文件缓冲区进行输入与输出。
    在这里插入图片描述

流式文件

C语言将文件看作是一个一个字符(字节)序列组成的,分为ASCII码文件和二进制文件两种,将这样的文件称为流式文件。
ASCII码文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)
二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能直接输出字符形式。

文件分类

(1)根据文件的性质(内容),将文件分为程序文件和数据文件。
(2)根据文件的组织形式,可分为顺序存取文件和随机存取文件。
(3)从用户的角度看,文件可以分为普通文件和设备文件两种。
(4)根据文件的存储形式(编码方式),文件分为ASCII码文件和二进制码文件,ASCII文件也称为文本文件。

2、读文件与写文件

读文件是将磁盘文件中的数据传送到计算机内存。
写文件是从计算机内存向磁盘文件中传送数据的操作。

3、文 件 指 针

文件类型 FILE
在C系统的头文件stdio.h中定义了一个名叫FILE的结构体类型。
系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为FILE。
结构类型名“FILE”必须大写
“文件指针”是缓冲文件系统中的一个重要概念。

typedef  struct{  short               level;	     /*  缓冲区饱和程度  */unsigned          flage;     /*  文件状态标志  */char                  fd;	      /*   文件号  */unsigned char    hold;	 /*  无缓冲区取消字符输入 */short                 bsize;    /* 缓冲区大小缺省值512 */unsigned char   *buffer;	/* 缓冲区指针*/unsigned char   *curp;	         /* 当前活动指针 */unsigned           istemp;	/* 草稿文件标识 */short                 token;	        /* 作正确性检验 */}   FILE ;

在缓冲文件系统中可以进行文件的打开、关闭、读、写、 定位等操作。要对文件进行相应的操作,必先定义一个指向文件的指针,这个指针称为文件指针

文件指针定义

定义文件指针的形式:
FILE *指针变量标识符;
其中FILE是由系统定义的一个结构类型, 该结构体类型中含有文件名、文件状态和文件当前位置等信息
例如,FILE *fp;
表示fp是指向FILE(文件)的指针变量,通过fp可找到它指向的文件的信息。

4、文件的打开和关闭

对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。
1.打开文件函数fopen()

FILE *fopen(“文件名”,“操作方式”);

功能:返回一个指向指定文件的指针。
函数原型:stdio.h 。
注:对文件操作的库函数,函数原型均在头文件stdio.h中

文件操作说明

(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。
用 fp 指向打开的文件后, 就可以用它来访问该文件

 FILE  *fp;     
fp=fopen("data.99""r")

如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为0)。为增强程序的可靠性,常用下面的方法打开一个文件:

 if((fp=fopen("文件名","操作方式"))==NULL){ printf("can not open this file\n"); exit(0); }  

对文件操作的方式(模式)

r ---- 以只读方式打开一个文本文件(该文件已存在)
位置指针指向文件头,从此处读数据
w ------ 以只写方式打开一个文本文件,若该文件不存
在,系统自动建立它,否则,刷新此文件,位
置指针指向文件头,从此处写数据。
a ------- 以追加方式打开一个文本文件,指针指向文件尾
r+ --------以读/写方式打开一个文本文件
打开文件时,读写位置指针指向文件头,以覆
盖方式写文件
w+ ------- 以读/写方式建立一个新的文本文件

对文件操作的方式(模式)

a+ --------以读/写方式打开一个文本文件打开文件时,读从文件头开始;写从文件尾部追加。
rb -------- 以只读方式打开一个二进制文件
wb -------- 以只写方式打开一个二进制文件
ab --------- 以追加方式打开一个二进制文件
rb+ -------- 以读/写方式打开一个二进制文件
wb+ ------- 以读/写方式打开一个新的二进制文件
ab+ -------- 以读/写方式打开一个二进制文件

有些C编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。
使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;
在输出时,将换行符转换成回车和换行两个字符。
使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。

在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针:

标准输入文件——stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据
标准输出文件——stdout:指向终端输出(一般为显示器)
标准错误文件——stderr:指向终端标准错误输出(一般为显示器)

文件关闭函数fcolse()

对一个文件操作完成后,要将该文件关闭,以避免文件的数据丢失等错误。
C语言中关闭一个文件通过系统函数fclose实现。

用法: int  fclose(FILE  *文件指针);

功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为0;否则,返回值为非0。

例如,fclose(fp)

关闭fp所指向的文件

示例:“w”方式打开文件(文本文件)

#include <stdio.h>
int main()
{   FILE *fp;fp=fopen("mydata1.txt","w");if (fp==NULL){ printf("file open error!\n");exit(0); } else{ printf("file open OK!\n");fclose(fp); }
}

5、文件的读写

字符读写函数fgetc和fputc

fgetc()函数从文件中读入一个字符

用法:int  fgetc(文件指针);

功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1个字节(即指向下一个字符)。该函数无出错返回值。
在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。

fputc()函数将一个字符写到文件中

 int  fputc(字符数据,文件指针);

其中“字符数据”,既可以是字符常量,也可以是字符变量。
功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。
如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量EOF(其值在头文件stdio.h中,被定义为-1)

字符串读写函数fgets和fputs

函数 fgets() 从文件中读一个字符串

 用法:char  *fgets(指针,串长度+1,文件指针);

功能:从指定文件中读入一个规定长度字符串,存入“字符数组/指针”中,并在尾端自动加一个结束标志‘\0’;同时将读写位置指针向前移动字符串长度个字节

库函数 fputs() 向指定文件输出一个字符串

用法:int  fputs(字符串,文件指针);

向指定文件输出一个字符串,同时将读写位置指针向前移动strlength(字符串长度)个字节。
函数返回值: 如果输出成功函数返回值为0;否则,为非0值

数据块读写函数

fread()和fwrite()函数一般用于二进制文件的处理。
读数据块函数fread

fread(buffer,size,count,fp); 

其中fp 是文件指针;buffer是一个指针,用来存放输入数据块的首地址;size 表示一个数据块的字节数;count表示要写的数据块块数。
函数功能:从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size * count个字节。

写数据块函数fwrite

fwrite(buffer,size,count,fp);

从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size*count个字节。
函数返回值:如果调用fread()或fwrite()成功,则函数返回值等于count。

位置指针复位函数 rewind
文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。 如果想改变系统这种读写规律,可使用有关文件定位的函数。
rewind函数调用形式为

rewind(文件指针)

函数的功能:使文件的位置指针返回到文件头。其中文件指针必须是有效的文件指针,即已指向文件。

格式化读写函数fscanf和fprintf

fscanf()和fprintf()函数的操作对象是指定文件,
scanf()和printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。
按格式化读取函数fscanf()

   int  fscanf(FILE *fp, char *format, &a1,&a2,&an)

int fscanf(文件指针, “格式符”, 输入变量首地址表);
调用形式:
fscanf( fp, format, &a1, &a2, &a3);
作用:按format给出的输入控制符,把从fp中读取的内容,分别赋给变元a1,a2,…an。

按格式化写入函数fprintf()

  int  fprintf(FILE *fp, char *format, a1,a2,…an);

作用: 按format给出的输出控制符,将变元a1,a2,…an的值写入到fp所指的文件中去。

随机读写与fseek()函数

对于流式文件,既可以顺序读写,也可随机读写
所谓顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。
所谓随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。

用法:int  fseek(文件指针,位移量,参照点);

功能:将指定文件的位置指针,从参照点开始,移动指定的字节数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫的Selenium(学习于b站尚硅谷)

目录 一、Selenium  1.为什么要学习Selenium  &#xff08;1&#xff09;什么是Selenium  &#xff08;2&#xff09;为什么使用selenium?  &#xff08;3&#xff09;代码演示 2. selenium的基本使用  &#xff08;1&#xff09;如何安装selenium  &#xff08;2…

探析STM32标准库与HAL库之间的差异与优劣

引言&#xff1a; 在嵌入式开发领域&#xff0c;STMicroelectronics的STM32系列芯片广受欢迎。STM32提供了两种主要的软件库&#xff0c;即标准库和HAL库&#xff0c;用于开发各种应用。本文将探讨这两种库之间的差异&#xff0c;比较它们的优劣&#xff0c;并分析在选择库时需…

数仓架构模型设计参考

1、数据技术架构 1.1、技术架构 1.2、数据分层 将数据仓库分为三层&#xff0c;自下而上为&#xff1a;数据引入层&#xff08;ODS&#xff0c;Operation Data Store&#xff09;、数据公共层&#xff08;CDM&#xff0c;Common Data Model&#xff09;和数据应用层&#xff…

Android 数据库之GreenDAO

GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架&#xff0c;将 Java 对象映射到 SQLite 数据库中&#xff0c;我们操作数据库的时候&#xff0c;不再需要编写复杂的 SQL语句&#xff0c; 在性能方面&#xff0c;greenDAO 针对 Android 进行了高度优化&#xff0c;…

IPWorks S3 Delphi Edition Crack

IPWorks S3 Delphi Edition Crack IPWorksS3使集成基于云的文件存储变得容易。易于使用的组件可用于与任何S3兼容的存储提供商集成&#xff0c;如Amazon S3、Digital Ocean Spaces、Wasabi、Backblaze B2、IBM Cloud Object storage、Oracle Cloud、Linode等。强大的客户端加密…

springboot+vue智能化网络电子相册图片管理系统_84ds3

随着计算机技术发展&#xff0c;计算机系统的应用已延伸到社会的各个领域&#xff0c;大量基于网络的广泛应用给生活带来了十分的便利。所以把智能化电子相册与现在网络相结合&#xff0c;利用计算机搭建智能化电子相册系统&#xff0c;实现智能化电子相册的信息化。则对于进一…

01_什么是ansible、基本架构、ansible工作机制、Ansible安装、配置主机清单、设置SSH无密码登录等

1.什么是ansible 1.1.基本介绍 1.2.基本架构 1.3.基本特征 1.4.优点 1.5.ansible工作机制 2.Ansible安装 2.1.机器准备 2.2.安装ansible 2.2.1.安装epel源 2.2.2.安装ansible 2.2.3.查看ansible版本 2.2.4.树状结构展示文件夹 2.2.4.1.其中ansible.cfg的内容如下 2.2.4.2.host的…

jmeter 二次开发详解

目录 背景&#xff1a; 自定义 BeanShell 功能 自定义请求编写&#xff08;Java Sampler&#xff09; 实现 Java Sampler 功能的两种方式 案例&#xff1a;使用 JavaSampler 重写 HTTP 的 POST 请求 自定义函数助手 背景&#xff1a; JMeter 是一个功能强大的性能测试工具…

The ‘kotlin-android-extensions‘ Gradle plugin is no longer supported.

Android使用kotlin开发&#xff0c;运行报错 The kotlin-android-extensions Gradle plugin is no longer supported. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.an…

linux umask 详解

1. umask 定义 在 linux 系统中&#xff0c;umask 被定义在 /etc/profile 配置文件中&#xff0c;有一段 shell 脚本对 umask 是这么定义的。在 shell 会话输入命令&#xff1a; $ cat /etc/profile # 查看 /etc/profile 配置文件的内容 if [ $UID -gt 199 ] &&…

Vue3中v-model在原生元素和自定义组件上的使用

目录 前言 一、原生元素上的用法 1. 输入框(input) 2. 多行文本域(textarea) 3. 单选按钮(radio) 4. 多选框(checkbox) 5. 下拉选择框(select) 二、自定义组件上的用法 1. 定义一个名为 modelValue 的 props 属性和一个名为 update:modelValue 的事件 2.使用一个可…

网络编程 tcp udp http编程流程 网络基础知识

讲解 网络基础知识网络编程tcp编程流程图示理解bind和accept函数理解监视套接字和链接套接字理解linux和window下的编程实现tcp特点 udp编程流程图示理解udp特点 http编程流程图示理解编程实现-网站服务器 网络基础知识 OSI分层&#xff1a;应用层 表示层 会话层 传输层 网络层…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

【MongoDB】解决ProxmoxVE下CentOS7虚拟机安装MongoDB6后启动失败的问题

目录 安装步骤&#xff1a; 2.1 配置yum源 2.2 安装MongoDB 2.3 启 动MongoDB ProxmoxVE上新装的CentOS7.4虚拟机&#xff0c;安装MongoDB6。 安装步骤&#xff1a; 2.1 配置yum源 # 创建mongodb yum源&#xff08;https://www.mongodb.com/docs/manual/tutorial/insta…

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…

【Vue3】插槽全家桶

插槽&#xff08;Slots&#xff09;是 Vue.js 框架中的一个功能&#xff0c;允许在组件内部预留一些可替换的内容。通过插槽&#xff0c;可以给父组件填充模板代码&#xff0c;让父组件向子组件传递自定义的内容&#xff0c;以便在子组件中进行展示或处理。 1. 匿名插槽 Son.…

初次使用GPU云服务器

前言&#xff1a; 在体验了GPU云服务器&#xff08;GPU Cloud Computing&#xff0c;GPU&#xff09;后&#xff0c;我认为这是一个非常强大的弹性计算服务。它为深度学习、科学计算、图形可视化、视频处理等多种应用场景提供了强大的GPU算力&#xff0c;能够满足各类用户的计算…

【动态规划】数字三角形

算法提高课课堂笔记。 文章目录 摘花生题意思路代码 最低通行费题意思路代码 方格取数题意思路代码 摘花生 题目链接 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道…

UML—浅谈常用九种图

目录 概述: 1.用例图 2.静态图 3.行为图&#xff1a; 4.交互图&#xff1a; 5.实现图&#xff1a; 概述: UML的视图是由九种视图组成的&#xff0c;分别是用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、实施图。我们可以根据这9种图的功能和实现的目的…

RocketMQ发送消息超时异常

说明&#xff1a;在使用RocketMQ发送消息时&#xff0c;出现下面这个异常&#xff08;org.springframework.messging.MessgingException&#xff1a;sendDefaultImpl call timeout……&#xff09;&#xff1b; 解决&#xff1a;修改RocketMQ中broke.conf配置&#xff0c;添加下…