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

【hello C语言】文件操作

目录

1. 什么是文件?

2. 程序文件

3. 数据文件

 4. 文件名

5. 文件类型

5.1 二进制文件

5.2 文本文件

5.3 数据在内存中的存储

 6. 文件缓冲区

 7. 文件指针

 8. 文件的打开和关闭

 9. 文件的顺序读写

10. 文件的随机读写

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

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

10.3 rewind:让文件的位置回到文件的起始位置

11. 文件结束判定

11.1 feof



 C语言🛴

1. 什么是文件?

在以前C语言的学习中,我们处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,这时候数据是存储在内存中的,重新启动程序数据便会消失。运行结果是显示到显示器上,同时也没有持久化的保存数据。

文件是用来持久化保存数据的。一般存储在磁盘上。

在程序设计中,我们一般谈的文件有两种:程序文件、数据文件

2. 程序文件

源文件:后缀为.c

目标文件:windows环境后缀为.obj

可执行程序:windows环境后缀为.exe

3. 数据文件

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

 4. 文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

例如:

F:\Users\LENOVO\Desktop\毕设\开题报告

为了方便起见,文件标识常被称为文件名

5. 文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件

5.1 二进制文件

数据在内存中以二进制的形式存储,如果不加转化的输出到外存,就是二进制文件

5.2 文本文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。

以ASCII字符的形式存储的文件就是文本文件

5.3 数据在内存中的存储

字符一律以ASCII码形式存储,数值型数据既可以用ASCII码形式存储,也可以使用二进制形式存储。

例如:

由整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占5个字节(每个字符占一个字节),而二进制形式输出,则在磁盘上只占4个字节(因为是整形)。

使用如下代码可以通过文件方式查看内存中的二进制显示:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");if (pf == NULL){perror("fopen");return;}else{fwrite(&a, 4, 1, pf);fclose(pf);pf = NULL;}return 0;
}

 6. 文件缓冲区

ANSIC 标准采用缓冲文件系统处理数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区
从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
缓冲区的大小根据C编译系统决定的。

 7. 文件指针

缓冲文件系统中,关键的概念是文件类型指针,简称文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。
这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.
不同的C编译器的 FILE 类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个 FILE 结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
下面我们可以创建一个FILE*的指针变量:
FILE* pf;//文件指针变量
定义pf是一个指向 FILE 类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件
比如:

 8. 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。
FILE* fopen(const char* filename, const char* mode);
int fclose(FILE* stream);

打开的方式如下:

文件使用方式含义如果指定文件不存在
"r"(只读)为了输入数据,打开一个已经存在的文本文件出错
"w"(只写)为了输出数据,打开一个文本文件建立一个新的文件
"a"(追加)向文本文件尾添加数据出错
"rb"(只读)为了输入数据,打开一个二进制文件出错
"wb"(只写)为了输出数据,打开一个二进制文件建立一个新的文件
"ab"(追加)向一个二进制文件尾添加数据出错
"r+"(读写)为了读和写,打开一个文本文件出错
"w+"(读写)为了读和写,建立一个新的文件建立一个新的文件
"a+"(读写)打开一个文件,在文件尾进行读写建立一个新的文件
"rb+"(读写)为了读和写打开一个二进制文件出错
"wb+"(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
"ab+"(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

示例代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{FILE* pFile;pFile = fopen("myfile.txt", "w");if (pFile == NULL)perror("fopen");fputs("fopen example", pFile);fclose(pFile);pFile = NULL;return 0;
}

 9. 文件的顺序读写

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

为了方便更好的使用,在此对比两组函数:
  • scanf 与 fscanf

 

  •  printf 与 fprintf

 

10. 文件的随机读写

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

int fseek ( FILE * stream, long int offset, int origin );

看个例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{FILE* pFile;pFile = fopen("example.txt","wb");fputs("This is an apple.", pFile);fseek(pFile, 9, SEEK_SET);fputs(" sam", pFile);fclose(pFile);pFile = NULL;return 0;
}

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

long int ftell ( FILE * stream );

看个例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{FILE* pFile;long size;pFile = fopen("myfile.txt", "rb");if (pFile == NULL)perror("fopen");fseek(pFile, 6, SEEK_SET);size = ftell(pFile);fclose(pFile);pFile = NULL;printf("Size of myfile.txt:%ld bytes.\n", size);return 0;
}

10.3 rewind:让文件的位置回到文件的起始位置

void rewind ( FILE * stream );
看个例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{int n;FILE* pFile;char buffer[27];pFile = fopen("myfile.txt", "w+");for (n = 'a'; n <= 'z';n++){fputc(n, pFile);}rewind(pFile);fread(buffer, 1, 26, pFile);fclose(pFile);pFile = NULL;buffer[26] = '\0';puts(buffer);return 0;
}

11. 文件结束判定

11.1 feof

注意:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
文本文件读取是否结束:判断返回值是否为EOFfgetc),或者NULLfgets
例如:
  • fgetc判断是否为EOF.
  • fgets判断返回值是否为NULL.
二进制文件的读取结束判断:判断返回值是否小于实际要读的个数。
例如:
  • fread判断返回值是否小于实际要读的个数。
正确的使用:

文本文件的例子:

判断是读取失败结束,还是文件结束的时候结束

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>int main()
{int c;FILE* fp = fopen("test.txt", "r");if (fp == NULL)perror("fopen");//fgetc当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF)putchar(c);if (ferror(fp))puts("I/O error when reading");elseputs("End of file reached successfully");fclose(fp);fp = NULL;return 0;
}

二进制文件的例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>enum
{SIZE = 5,
};int main()
{double a[SIZE] = { 1.0,2.0,3.0,4.0,5.0 };double b = 0.0;size_t ret_cobe = 0;FILE* fp = fopen("test.bin", "wb");fwrite(a, sizeof(double), SIZE, fp);fclose(fp);fp = NULL;fp = fopen("test.bin", "rb");while ((ret_cobe = fread(&b, sizeof(double), 1, fp)) >= 1)printf("%lf\n", b);if (feof(fp))printf("Error reading test.bin:unexpected end of file\n");else if (ferror(fp))perror("Error reading tes.bin");fclose(fp);fp = NULL;return 0;
}

坚持打卡!😃

相关文章:

【hello C语言】文件操作

目录 1. 什么是文件&#xff1f; 2. 程序文件 3. 数据文件 4. 文件名 5. 文件类型 5.1 二进制文件 5.2 文本文件 5.3 数据在内存中的存储 6. 文件缓冲区 7. 文件指针 8. 文件的打开和关闭 9. 文件的顺序读写 10. 文件的随机读写 10.1 fseek&#xff1a;根据文件指针的位置和偏移…...

OBCP第八章 OB运维、监控与异常处理-数据库监控

系统监控视图&#xff1a;系统视图 OceanBase 数据库为多租户架构&#xff0c;租户分为两种类型&#xff1a;普通租户以及 sys 租户。OceanBase 数据库系统表都存储在 sys 租户&#xff0c;且主键中存储租户号&#xff08;tenant_id&#xff09;&#xff0c;区分每个租户的内容…...

已经提了离职,还有一周就走,公司突然把我移出企业微信,没法考勤打卡, 还要继续上班吗?...

黎明前的黑暗最容易出事&#xff0c;离职前的几天也最容易出幺蛾子&#xff0c;比如下面这位网友的遭遇&#xff1a;已经提了离职&#xff0c;还有一周就正式离职了&#xff0c;公司突然把我移出企业微信&#xff0c;没法考勤打卡了&#xff0c; 还要继续上班吗&#xff1f;该怎…...

Win11启用IE方法

呉師傅 Win11是微软目前的最新系统&#xff0c;尽管该系统非常不错&#xff0c;但是还是有很多不一样的地方&#xff0c;有的用户发现Win11没有了IE浏览器&#xff0c;那么Win11没有IE浏览器怎么办呢&#xff0c;有的旧网页需要IE浏览器才能进入&#xff0c;下面就给大家提供一…...

有人靠ChatGPT 狂赚200W !有人到现在,连账号都没开通......

作者| Mr.K 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)互联网风水轮流转&#xff0c;当初元宇宙盛极一时之际&#xff0c;在一些知识付费平台上&#xff0c;任何一个关于元宇宙的课程或培训&#xff0c;都很热销&#xff0c;有一定号召力的博主&#xff0c;登…...

基于GD32F470的mbedtls 3DES算法测试

3DES加密算法介绍 3DES数据加密算法是一种可逆的对称加密算法&#xff0c;也称三重数据加密算法。3DES块加密算法的设计用来提供一种相对简单的方法&#xff0c;即通过增加DES的密钥长度来避免类似的攻击&#xff0c;而不是设计一种全新的密码算法&#xff0c;目前3DES作为DES…...

为什么一些人很瞧不起 Java?

前言 瞧不起Java的大概是因为&#xff1a; Java 被认为是一门“老”语言&#xff0c;过时了。事实上&#xff0c;Java 由于其稳定性和安全性&#xff0c;一直是企业级应用开发的首选语言。而且&#xff0c;Java 语言还在不断更新和发展&#xff0c;例如 Java 8 引入了很多新特…...

DropMAE: Masked Autoencoders with Spatial-Attention Dropout for Tracking Tasks

摘要 ​ 在本文中&#xff0c;我们研究了掩码自动编码器&#xff08;MAE&#xff09;预训练的视频基于匹配的下游任务&#xff0c;包括视觉目标跟踪&#xff08;VOT&#xff09;和视频对象分割&#xff08;VOS&#xff09;。MAE的一个简单扩展是在视频中随机掩码帧块并重建帧像…...

【shell 基础(11)循环之for】带列表:空格子串、换行子串、展开、命令替换、seq;不带列表:接受参数、类C

文章目录一. 带列表的for循环1. 语法2. 例子2.1. 循环字串2.2. 展开或命令替换&#xff1a;数字循环2.3 命令替换&#xff08;输出换行&#xff09;作为list二. 其他for循环1. 不带列表的循环2. 类C的for循环一. 带列表的for循环 1. 语法 for var in list do commanddone注意…...

虚拟环境中创建Django项目 详细完整

一、自身安装python&#xff08;我自身安装的python3.6.8&#xff09; &#xff08;1&#xff09;官网&#xff1a; Python Releases for Windows | Python.org for windows> 这样下载慢的话&#xff0c;以下链接复制到迅雷下载&#xff1a; https://www.python.org/ftp/…...

BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC

BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC 8.1 JDBC 介绍 8.1.1 什么是 JDBC JDBC&#xff08;Java Database Conectivity&#xff09; Java数据库连接技术的简称&#xff0c;提供连接各种常用数据库的能力 8.1.2 JDBC 的工作原理 JDBC API 内容&#xff1a;供程序员…...

一位程序员将一款开源工具变成了价值75亿美元的帝国

他的成功&#xff0c;激励着年轻的程序员为什么翻译这些程序员大佬的成功故事&#xff1f;除了写代码&#xff0c;作为开发者&#xff0c;我们也需要时不时地仰望星空。我们每个人都怀有着远大的理想&#xff0c;希望用代码改变自己的生活、行业&#xff0c;甚至是这个世界。编…...

tmux | 终端操作软件,解决深度学习中终端相关问题

tmux 一次可运行多个终端会话。或者在后台运行终端会话。当需要一次访问多个 ssh 会话或只是为了一个便利的流程管理时&#xff0c;这很有帮助。例如&#xff0c;可以在下载最新的系统更新时运行 htop&#xff0c;编辑配置文件并在一个 tmux 会话中重新启动服务。 对于我来说t…...

信号 捕捉

signal 函数 作用&#xff1a;注册一个信号捕捉函数&#xff08;注册而非创建&#xff09; 原型&#xff1a; sighandler_t signal(int signum, sighandler_t handler);typedef void (*sighandler_t)(int);案例一&#xff1a; signal函数 捕捉 ctrlc 触发事件 #include<std…...

sqlserver中判断是否存在的方法

自定义变量 declare age int declare name varchar(20) set name‘张三’ --用set 方法给变量赋值 注&#xff1a; 此方法一次只能给一个变量赋值 select ageage from client where [name]name --查询客户张三的年龄赋值给age变量 注&#xff1a;此方法能一次多个变量赋值 …...

基于Kettle跑批的案例说明

需求概述 通过动态配置表的方式完成在kettle里动态配置参数&#xff0c;并调用ktr&#xff0c;实现跑批的目的。 问题分析 定义一个ktr读取配置表的信息并将拷贝记录到结果定义一个ktr从结果里获取记录并设置变量定义业务ktr&#xff08;即按照业务需要开发的…...

2023 最新版网络安全保姆级自学指南

前言 如今&#xff0c;组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故&#xff0c;以及来自黑客或竞争对手攻击等防御和恢复能力。而…...

Chapter9.3:线性系统稳定性分析及综合实例

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…...

EXCEL 在复杂查询时摒弃vlookup() sumif() 等公式,而使用数据透视表的初步学习

1 为什么要用数据透视表 如果不用&#xff0c;就可能需要写很复杂的&#xff0c;查询公式 比如&#xff0c;vlookup各种sumif,sumifs 等等&#xff0c;如果还是多个表进行统计&#xff0c;那写起来更酸爽所以感觉 vlookup sumif,sumifs 更适合&#xff0c;简单情况下的查询&am…...

C 文件读写

C 文件读写 本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件&#xff0c;无论它是文本文件还是二进制文件&#xff0c;都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数&#xff0c;也提供了底层&#xff08;OS&#xff09;调用来处理存…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...