当前位置: 首页 > 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;调用来处理存…...

Linux中实现程序开机自启——将程序配置为系统服务

一、需求说明 当我们在Linux系统上安装软件时,希望软件实现开机自启,或程序崩溃后自动重启,提升软件运行的稳定性;而linux系统中的systemd刚好可以满足我们的要求(可将软件注册为系统服务)。 二、systemd systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务…...

【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(13)

目录 写在前面&#xff1a; 题目&#xff1a;P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; AC &am…...

【新2023Q2模拟题JAVA】华为OD机试 - 总最快检测效率 or 核酸检测效率

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:报数 题目 一百个人围成一圈…...

基于主成分分析的混音方法

一、简介&#xff1a; 基于主成分分析的混音方法是一种常见的音频混音技术&#xff0c;它利用主成分分析&#xff08;PCA&#xff09;对音频信号进行降维和重构&#xff0c;从而实现混音。 二、基本步骤如下&#xff1a; 采集和存储需要混音的音频信号。 对音频信号进行主成分…...

Code Two Exchange Crack

CodeTwo Exchange 迁移允许直接从早期版本的 Exchange&#xff08;从 Exchange 2010 开始&#xff09;安全、轻松地迁移到 Exchange 2019 和 2016。此服务器应用程序还允许您集中管理来自 Microsoft 365 (Office 365) 的邮箱迁移以及来自基于 IMAP 的电子邮件系统&#xff08;例…...

jQuery.form.js 详细用法_维护老项目使用

概述 jquery-3.3.1.min.js &#xff1a; http://jquery.com/download jquery.form.min.js &#xff1a;http://malsup.com/jquery/form/#tab7 jquery form 是一个表单异步提交的插件&#xff0c;可以很容易提交表单&#xff0c;设置表单提交的参数&#xff0c;并在表单提交前…...

【Java】关于你不知道的Java大整数运算之BigInteger类超级好用!!!

目录 一、BigInteger类简单介绍 二、BigInteger构造方式 &#xff08;1&#xff09;构造方式 &#xff08;2&#xff09;输入方式 三、BigInteger常见的成员方法 &#xff08;1&#xff09;方法介绍 &#xff08;2&#xff09;方法使用演示 1.加减乘除余 2.比较 3.绝…...

运维是不是没有出路了?

瑞典马工的​​《是时候让运维集体下岗了》一出&#xff0c;就让运维人为之一颤&#xff0c;​人人自危。文章开篇就提到&#xff1a;​​明人不说暗话&#xff0c;在云原生和DevOps成熟的今天&#xff0c;运维作为一个岗位和团队已经完成了历史任务&#xff0c;应该退出舞台了…...

【C++笔试强训】第七天

选择题 解析&#xff1a;内联函数&#xff08;inline&#xff09;一般用于代码较少&#xff0c;代码块里面没有递归且频繁调用的函数&#xff0c;是一种以空间换时间&#xff08;不是指内存&#xff0c;而是指令变多编译出来的可执行程序会变大&#xff09;的做法。内联函数在预…...

mysql binlog 一直追加写,磁盘满了怎么办?

文章目录 mysql binlog 清理策略1、设置binlog最大的文件数和文件大小2、定时清理过期binlog文件3、手动清理binlog文件4、禁用或启用binlogmysql binlog用于记录mysql数据库所有变更(数据库的DDL、DML操作)包括用户执行的语句,以及底层引擎所执行的操作的二进制日志,主要用…...