当前位置: 首页 > news >正文

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(文件指针,位移量,参照点);

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

相关文章:

C语言文件操作基本方法

1、文件的分类 ANSI C 的缓冲文件系统 缓冲文件系统 缓冲文件系统是指&#xff0c;系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时&#xff0c;必须首先输出到缓冲区中。待缓冲区装满后&#xff0c;再一起输出到磁盘文件中。 从磁盘文件向内…...

SQL 相关子查询 和 不相关子查询、Exists 、Not Exists、 多表连接(包含自连接)

不相关子查询 子查询的查询条件不依赖于父查询&#xff0c;称不相关子查询。子查询可以单独运行的 select stu_id,sex,age from student t where sex(select sexfrom studentwhere stu_id10023 )相关子查询 关联子查询 子查询的查询条件依赖于父查询&#xff0c;称为 相关子…...

项目规范 编写规范(范例)

项目目录 目录接口参考 项目目录结构设计&#xff0c;增加部分领域模型后缀强制定义&#xff0c;方便统一编码风格。 controller&#xff1a;请求处理 RestController module&#xff1a;按大业务区分&#xff0c;对多个业务对象数据聚合处理 Component manager&#xff1a;…...

MongoDB数据库操作及操作命令

目录 一、基础概念 二、安装mongod 三、命令交互数据库 &#xff08;1&#xff09;数据库命令 &#xff08;2&#xff09;集合命令 &#xff08;3&#xff09;文档命令 四、Mongoose &#xff08;1&#xff09;增加一条数据 &#xff08;2&#xff09;插入多个数据 &am…...

Linux命令(62)之tee

linux命令之tee 1.tee介绍 linux命令tee于读取标准输入的数据&#xff0c;并将内容输出为文件 2.tee用法 tee [参数] [filename] tee参数 参数说明-a读取标准输入的数据&#xff0c;并将内容追加到文件&#xff0c;而非覆盖-i忽略中断信号 3.实例 3.1.将ls -l输出内容作为…...

搭建Repo服务器

1 安装repo 参考&#xff1a;清华大学开源软件镜像站:Git Repo 镜像使用帮助 2 创建manifest仓库 2.1 创建仓库 git init --bare manifest.git2.2 创建default.xml文件 default.xml文件内容&#xff1a; <?xml version"1.0" encoding"UTF-8" ?…...

安卓:MMKV——键值存储库

目录 一、MMKV介绍 1.特点和优势&#xff1a; 2.使用指南&#xff1a; 3.依赖包&#xff1a; 二、MMKV的常用方法 1、初始化和获取实例&#xff1a; 2、存储数据&#xff1a; 3、读取数据 4、删除数据 5、其他操作&#xff1a; 三、MMKV的使用例子 MainActivity&#xff…...

使用Python将图像转换为PDF:一次性解决您的批量转换需求

导语&#xff1a; 在数字化时代&#xff0c;我们经常需要处理大量的图像文件。将这些图像转换为PDF格式可以方便地存档、分享和打印。本文将介绍如何使用Python编程语言将图像批量转换为PDF&#xff0c;并提供了一个简单易用的图形界面来跟踪转换进度。 准备工作 在开始之前…...

Vue——webpack

webpack 一、Install1.全局安装2.局部安装 二、总结1.打包2.定义脚本3.配置文件定义&#xff08;webpack.config.js)4.项目重新加载依赖5.webpack打包Css6.style-loader 一、Install 1.全局安装 npm install webpack webpack-cli -g2.局部安装 以项目为单位&#xff0c;一个项…...

springboot房地产管理java购房租房二手房j客户sp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 springboot房地产管理 系统1权限&#xff1a;管理员 …...

Gartner 发布影响数据科学和机器学习未来方向重要趋势

出品 | CSDN 云计算 供稿 | Gartner Gartner今日发布了影响数据科学与机器学习&#xff08;DSML&#xff09;未来方向的重要趋势。随着DSML行业的快速发展和演变&#xff0c;数据对于人工智能&#xff08;AI&#xff09;开发与运用的重要性日益提高&#xff0c;尤其是投资重点…...

72. 编辑距离

题目介绍 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 &q…...

Android12.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在12.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…...

周末在家值班,解决几个月前遗忘的Bug

问题&#xff1a; 周末被迫在家值班&#xff0c;无聊之际打开尘封已久的Bug清单&#xff0c;发现有Bug拖了几个月还没解决… 场景是这样子的&#xff0c;有个功能是拿Redis缓存热点数据进行展示&#xff0c;暂且称它为功能A&#xff0c;有个另外的功能B&#xff0c;它会去更新缓…...

Shell编程基础(十五)文本三剑客(sed)

文本三剑客&#xff08;sed&#xff09; 使用场景基本语法实例命令列表 使用场景 sed提供了一种面交互的方式修改文件内容。 它是一行一行处理&#xff0c;可以通过正则匹配要修改的部分 基本语法 基本语法 sed [-opt] command files(多个文件 空格隔开) sed 使用正则 sed -…...

5,二叉树【p6-p7】

二叉树 5.1二叉树5.1.1例1&#xff1a;用递归和非递归两种方式实现二叉树的先序、中序、后序遍历5.1.1.1递归序的先序、中序、后序遍历先序遍历&#xff1a;中序遍历&#xff1a;后序遍历&#xff1a; 5.1.1.2非递归序的先序、中序、后序遍历先序遍历&#xff1a;中序遍历&…...

【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry

文章目录 前言Spring Retry的基本使用第一步&#xff0c;引入Spring Retry的jar包第二步&#xff0c;构建一个RetryTemplate类第三步&#xff0c;使用RETRY_TEMPLATE注意事项 拓展方法降级操作重试策略&#xff1a;时间策略重试策略&#xff1a;指定异常策略 前言 Spring Retr…...

pagehelper 优化自定义分页和排序位置

pagehelper开源地址 https://github.com/pagehelper/Mybatis-PageHelper 1.手写Count查询优化 源码分页count时首先是判断是否存在手写的 {业务查询id}_COUNT 的查询count统计 private Long count(Executor executor, MappedStatement ms, Object parameter,RowBounds rowBound…...

Linux下查询文件夹中文件数量的方法

一、前言 在Linux系统中&#xff0c;我们经常需要查询文件夹中包含多少文件。本文将介绍三种在Linux中查询文件夹中文件数量的方法&#xff0c;帮助你轻松获取所需信息。 二、方法 1、使用ls命令和wc命令 使用ls命令的-l选项和管道操作符|结合wc命令来统计文件数量&#xf…...

PS透明屏,在科技展示中,有哪些优点展示?

PS透明屏是一种新型的显示技术&#xff0c;它将传统的显示屏幕与透明材料相结合&#xff0c;使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性&#xff0c;通…...

Hbase-面试题

1. Hbase-region切分 自动切分&#xff0c;默认情况下 2.0版本&#xff0c;第一次region的数据达到256M&#xff0c;会进行切分&#xff0c;以后就是每达到10G切分一次&#xff0c;切分完成后&#xff0c;会进行负载均衡&#xff0c;均衡到其他regionserver预分区自定义rowke…...

图的宽度优先深度优先遍历

图常见的遍历方式有两种&#xff0c;一种是宽度优先遍历&#xff0c;一种是深度优先遍历。 宽度优先遍历 宽度优先遍历和之前介绍的二叉树的层级遍历类似&#xff0c;主要也是利用Queue来完成层级的遍历&#xff0c;除此之外&#xff0c;因为图中很可能有环&#xff0c;所以还…...

redis Set类型命令

Redis中的Set是一种无序、不重复的集合数据结构&#xff0c;它提供了一系列的操作命令用于对Set进行添加、删除和查找等操作。以下是Redis中Set类型常见的一些命令&#xff1a; SADD key member [member …]&#xff1a;将一个或多个成员添加到指定的集合中。 示例&#xff1a;…...

Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发

一、DefaultEventExecutorGroup的用途 DefaultEventExecutorGroup 是 Netty 框架中的一个类&#xff0c;用于管理和调度事件处理器&#xff08;EventExecutor&#xff09;的组。在 Netty 中&#xff0c;事件处理是通过多线程来完成的&#xff0c;EventExecutor 是处理事件的基…...

TCP的四次挥手与TCP状态转换

文章目录 四次挥手场景步骤TCP状态转换 四次挥手场景 TCP客户端与服务器断开连接的时候&#xff0c;在程序中使用close()函数&#xff0c;会使用TCP协议四次挥手。 客户端和服务端都可以主动发起。 因TCP连接时候是双向的&#xff0c;所以断开的时候也是双向的。 步骤 三次…...

【网络编程】实现一个简单多线程版本TCP服务器(附源码)

TCP多线程 &#x1f335;预备知识&#x1f384; Accept函数&#x1f332;字节序转换函数&#x1f333;listen函数 &#x1f334;代码&#x1f331;Log.hpp&#x1f33f;Makefile☘️TCPClient.cc&#x1f340;TCPServer.cc&#x1f38d; util.hpp &#x1f335;预备知识 &…...

centos离线部署docker

有些内部环境需要离线部署&#xff0c;以下做一些备忘。 环境&#xff1a;centos7.9 准备文件&#xff1a; docker-20.10.9.tgz&#xff0c;下载地址 https://download.docker.com/linux/static/stable/x86_64/docker.service&#xff0c;内容见下文daemon.json&#xff0c;内…...

ffmpeg使用滤镜对视频进行处理播放

一、前言 在现代的多媒体处理中,视频和音频滤镜起着至关重要的作用。可以帮助开发者对视频和音频进行各种处理,如色彩校正、尺寸调整、去噪、特效添加等。而FFmpeg作为一个功能强大的开源多媒体框架,提供了丰富的滤镜库,使我们能够轻松地对多媒体文件进行处理和转换。 本…...

Ansible Handlers模块详解,深入理解Ansible Handlers 自动化中的关键组件

深入理解Ansible Handlers 自动化中的关键组件 在现代的IT环境中&#xff0c;自动化已经成为提高效率和减少错误的关键。Ansible作为一款流行的自动化工具&#xff0c;通过使用Playbooks来定义和执行任务。而Handlers作为Ansible的组件之一&#xff0c;在自动化过程中发挥着重要…...

threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率

先来个效果图 之前写的那个稍微有点问题&#xff0c;帧率只有30&#xff0c;参照官方代码修改后&#xff0c;帧率可以达到50了&#xff0c;在不全屏的状态下&#xff0c;帧率60 1.首先需要导入库 // 用于模型边缘高亮 import { EffectComposer } from "three/examples/js…...

昆明网站建设电话/兰州seo整站优化服务商

两种使用方式&#xff1a;1自定义类继承自相应的类或接口&#xff0c;重写方法&#xff0c;作为特性使用2 在控制器类中重写方法特性方式的使用注意&#xff1a;如果继承自接口需要让类实现FilterAttribute&#xff0c;才可以作为特性使用使用方式1&#xff1a;作为Controller或…...

济南专业网站设计/网站关键词优化软件效果

一、消息通知 在一些网站上&#xff0c;经常会有一些发布/订阅或者邮件订阅的功能&#xff0c;尤其一些博客上。其实这种问题很常见&#xff0c;当页面需要进行如发送邮件、复杂的计算时会阻塞页面的渲染。为了避免用户等待太久&#xff0c;应该使用其他进程单独完成此类操作&a…...

建设网站公司排名/国际新闻最新消息十条

首先要初始化计算&#xff0c;然后定义contour图&#xff0c;然后在solution animation中设置相关图像以及设置存储类型。然后点击计算开始计算&#xff0c;计算完毕后在animation 中找到playback&#xff0c;选择相关动画以及输出帧数以及输出类型&#xff0c;输出即可...

服务器网站建设维护合同/seo sem

一、前言 cas 一般认为是compare and swap 也可以认为是compare and set cas涉及三个值 &#xff08;1&#xff09; P 变量内存地址 &#xff08;2&#xff09;E 期望值 ,CPU做计算之前拿出来的旧值 (3) X 需要设置的新值 原子操作为&#xff1a; 拿出内存地址当前的值A ,比…...

燕郊网站制作多少钱/软文发布的平台与板块

官方教程 感觉离线装&#xff0c;和其他的教程都是邪路。 建议安装官方安装教程。 https://pytorch.org/get-started/locally/ 然后如果在线装时间慢&#xff0c;建议用国内源。 pip的国内源教程&#xff1a; https://blog.csdn.net/hehedadaq/article/details/99887356 conda…...

用vs session做网站/seo实战指导

在神经网络还是全连接层的时代&#xff0c;由于模型参数是在过多导致模型难以训练。尽管&#xff0c;理论上&#xff0c;全连接层的模型可以拟合任意的线性函数和非线性函数&#xff0c;但是&#xff0c;由于该模型参数是在过多&#xff0c;导致训练难以实施。 于是&#xff0c…...