c语言:文件操作(1)
前言:为什么要使用文件
使用文件可以让程序在不同运行之间保存和读取数据。这样可以实现持久化存储,即使程序关闭后数据也不会丢失。文件也可以用于数据交换,允许不同程序之间共享信息。在 C 语言中,文件还可以用于读取配置信息,日志记录等。当你玩电脑游戏时,游戏通常会让你保存进度。这就好比把游戏状态保存到一个文件中,这样你可以在之后重新加载游戏而不会丢失进度。另外,想象一下你在做一份报告,你可以把报告内容保存到文件中,这样即使你关掉电脑,文件中的内容也会被保存下来,以便你之后再次打开并继续编辑。文件就像是一个存储盒,可以把数据放进去,然后在需要的时候再取出来使用。总的来说,文件在编程中是非常重要的,可以帮助程序处理数据和信息。
文件的定义
文件是计算机存储数据的一种方式,可以存储文本、图像、音频、视频等各种类型的信息。在计算机中,文件通常被组织成一个由字节组成的序列,每个文件都有一个唯一的名称用于标识。文件可以存储在计算机的硬盘、固态硬盘、光盘、U盘等存储介质上。
分类:
从文件功能的角度分为两类:程序文件,数据文件。
程序文件:
程序文件是计算机中用来存储软件程序代码的文件。程序文件可以包含各种编程语言编写的指令和数据,用于告诉计算机如何执行特定的任务或操作。
程序文件通常也具有特定的文件扩展名或后缀,以便操作系统和用户能够识别它们并正确地处理。这些后缀通常指示了程序文件的类型或格式。例如:
- 可执行程序文件通常以.exe、.app、.bat等结尾。
- 脚本文件通常以.sh、.py、.js等结尾。
- 动态链接库文件通常以.dll、.so等结尾。
- Java程序文件通常以.jar、.class等结尾。
- HTML网页文件通常以.html、.htm结尾。
数据文件:
数据文件是计算机中用来存储各种类型数据的文件。这些数据可以是文本、图像、音频、视频、数据库记录等。数据文件通常以特定的格式存储,以便计算机能够正确地读取和解释其中的信息。这些文件可以通过各种应用程序进行创建、编辑和访问,以便用户能够查看、修改和管理其中的数据。
数据文件通常具有特定的文件扩展名或后缀,以便操作系统和应用程序能够识别它们并正确地处理。这些后缀通常指示了数据文件的类型或格式。例如:
- 文本文件通常以.txt、.doc、.pdf等结尾。
- 图像文件通常以.jpg、.png、.gif等结尾。
- 音频文件通常以.mp3、.wav、.flac等结尾。
- 视频文件通常以.mp4、.avi、.mov等结尾。
- 数据库文件通常以.db、.mdb、.sql等结尾。
文件名
假设你有一个名为"mydocument.docx"的文件,它存储在Windows操作系统的C盘的Documents文件夹中。在这种情况下,文件名的各部分如下:
- 文件路径:C:\Documents\
- 文件名主干:mydocument
- 文件后缀:.docx
C:\Documents\mydocument.docx 二进制文件和文本文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
二进制文件:数组在内存中以二进制的形式存储,不加转换的输出到外存。
文本文件:以ASCLL字符的形式存储的文件。

示例:
#include<stdio.h>
int main()
{// 定义一个整型变量a,赋值为10000int a = 10000;// 打开一个名为test.txt的文件,以二进制写入模式打开FILE* pf = fopen("test.txt", "wb");// 将变量a的内容以二进制形式写入到文件中fwrite(&a, 4, 1, pf);// 关闭文件fclose(pf);// 将文件指针置为空pf = NULL;// 返回0,表示程序正常结束return 0;
}
这段代码的功能是将整数变量a的值10000以二进制形式写入到名为test.txt的文件中。具体来说,它通过fopen函数以二进制写入模式打开文件,然后使用fwrite函数将整数a的二进制表示写入到文件中,最后使用fclose关闭文件。
效果演示:
1.运行完程序后,返回解决方案资源管理器。
找到源文件,添加,现有项

2.点开, 找到test文件,双击test文件。

3,回到解决方案中, 此时,已经出现了test.txt文件,右键此文件,找到打开方式,选择二进制编译器,确定

4.得到结果,观察二进制文件。
流和标准流
在C语言中,流(stream)是一个用于输入和输出的抽象概念。它提供了一种统一的方式来处理不同类型的输入和输出,包括文件、键盘、屏幕和其他设备。
你可以把它想象成水流。就像水流可以从一个地方流向另一个地方一样,流在计算机编程中也是用于数据的流动。
标准流
C语言中有三个标准流:
- 标准输入流(stdin): 用于从键盘或其他输入设备读取数据。在C语言中,
scanf函数就是从标准输入流中读取数据的一个例子。 - 标准输出流(stdout): 用于向屏幕或其他输出设备输出数据。在C语言中,
printf函数就是向标准输出流输出数据的一个例子。 - 标准错误流(stderr): 用于向屏幕或其他输出设备输出错误信息。在C语言中,
fprintf函数可以向标准错误流输出数据。
stdin、stdout、stderr三个流的类型是:FILE*,通常称为文件指针。
C语言中,就是通过FILE*的文件指针来维护流的各种操作的。
文件指针
文件指针是C语言中用于处理文件的重要概念。它是一个指向FILE类型的指针,FILE类型是C语言标准库中用于表示文件的结构体类型。
例如:VS2022编译器环境下提供的stdio.h头文件中,有以下的文件类型声明:
typedef struct
{int _Placeholder;
} fpos_t;typedef struct
{unsigned int _Mode;
} _fmode_t;typedef struct
{long long _Placeholder;
} fpos64_t;typedef struct _iobuf
{char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;
} FILE;typedef struct _wfinddata_t
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;_fsize_t size;wchar_t name[260];
} _wfinddata_t;typedef struct _wfinddatai64_t
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;__int64 size;wchar_t name[260];
} _wfinddatai64_t;typedef struct _wfinddata32_t
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;unsigned long size;wchar_t name[260];
} _wfinddata32_t;typedef struct _wfinddata32i64_t
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;unsigned __int64 size;wchar_t name[260];
} _wfinddata32i64_t;
文件的关闭和打开:
打开文件
要使用文件指针,首先需要打开文件。可以使用fopen函数来打开文件,该函数会返回一个指向FILE类型的指针,表示打开的文件。fopen函数的原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename是要打开的文件名,mode表示文件的打开模式,比如读取、写入、追加等。
文件指针的位置
文件指针指示了文件中当前的位置,它可以在文件中移动,以便进行读取或写入操作。可以使用fseek函数来移动文件指针的位置:
int fseek(FILE *stream, long offset, int origin);
其中,stream是文件指针,offset是偏移量,origin表示起始位置,可以是SEEK_SET(文件开头)、SEEK_CUR(当前位置)或SEEK_END(文件末尾)。
读写文件
一旦文件被打开,就可以使用文件指针进行读取和写入操作。比如,可以使用fscanf和fprintf函数进行格式化的输入和输出,或者使用fread和fwrite函数进行二进制数据的读写操作。
关闭文件
在文件操作完成后,应该使用fclose函数关闭文件,释放文件资源:
int fclose(FILE *stream);
示例
下面是一个示例,演示了如何使用文件指针来打开文件、写入数据并关闭文件:
#include <stdio.h>int main()
{FILE *fp;fp = fopen("example.txt", "w"); // 以写入模式打开文件if (fp != NULL) {fprintf(fp, "This is a file created using file pointers!"); // 写入数据fclose(fp); // 关闭文件}return 0;
}
下一章节,讲文件的读写顺序,等各种顺序读写函数。
相关文章:
c语言:文件操作(1)
前言:为什么要使用文件 使用文件可以让程序在不同运行之间保存和读取数据。这样可以实现持久化存储,即使程序关闭后数据也不会丢失。文件也可以用于数据交换,允许不同程序之间共享信息。在 C 语言中,文件还可以用于读取配置信息&…...
运筹学经典问题(三):最大流问题
问题描述 给定一个图网络 G ( V , E ) G(V, E) G(V,E),网络中连边的权重代表最大容量,在这个图中找出从起点到终点流量最大的路径。 数学建模 集合: I I I:点的集合; E E E:边的集合。 常量&#x…...
裸机开发与Linux驱动开发的区别
一. 简介 裸机开发,即我们常说的不带系统的单片机开发。 Linux驱动开发,即带文件系统的Linux驱动的开发。 二. 裸机开发与Linux驱动开发的区别 1. 裸机开发 比较底层,跟寄存器打交道,有些 MCU提供了库。 2. Linux驱动开发…...
【蓝桥杯选拔赛真题75】Scratch行走的螃蟹 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析
目录 scratch行走的螃蟹 一、题目要求 编程实现 二、案例分析 1、角色分析...
小型洗衣机哪个牌子质量好?迷你洗衣机排名前十名
随着内衣洗衣机的流行,很多小伙伴在纠结该不该入手一款内衣洗衣机,专门来洗一些贴身衣物,答案是非常有必要的,因为我们现在市面上的大型洗衣机只能做清洁,无法对我们的贴身衣物进行一个高强度的清洁,而小小…...
MySQL_9.B-数索引
1.定义:B-树是一类树,包括B-树、B树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点. 2.B-数产生的原因 当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的…...
ubuntu-更改镜像源-系统初始化-安装Clion-C++编译环境-Java安装
文章目录 1.镜像配置文件及更新2.安装java sdk并配置环境变量3.安装Clion4.总结 1.镜像配置文件及更新 将sources.list备份保存为sources.list.backup,以防止有需要的时候更换回来。 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup sudo gedit /etc/apt/source…...
c语言-动态内存管理
文章目录 一、为什么会有动态内存管理二、申请内存函数1、malloc2、free3、calloc4、realloc 三、常见的动态内存的错误四、练习 一、为什么会有动态内存管理 1.我们一般的开辟空间方式: int a 0;//申请4个字节空间 int arr[10] { 0 };//申请40个字节空间2.这样…...
【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)
🌈个人主页: Aileen_0v0🔥系列专栏:Java学习系列专栏💫个人格言:"没有罗马,那就自己创造罗马~" 目录 回顾 构造方法 this关键字 面试题 构造方法的类型 下节预告 代码块 🍒回顾 之前我们学习了什么是类 什么是…...
动态规划学习——通符串匹配,正则表达式
目录 编辑 一,通符串匹配 1.题目 2.题目接口 3,解题思路及其代码 二,正则表达 1.题目 2.题目接口 3.解题思路及其代码 三,交错字符串 1.题目 2,题目接口 3.解题思路及其代码 一,通符串匹配 1…...
【数据开发】Hive 多表join中的条件过滤与指定分区
1、条件过滤 left join 中 on 后面加条件 where 和 and 的区别 1、 on条件是在生成临时表时使用的条件,它不管and中的条件是否为真,都会保留左边表中的全部记录。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有le…...
基于Java SSM框架实现高校人事管理系统项目【项目源码】计算机毕业设计
基于java的SSM框架实现高校人事管理系统演示 JSP技术介绍 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了用户的需…...
[C++] 模板进阶(非类型模板参数,特化,分离编译)
文章目录 1、非类型模板参数2、模板的特化2.1 什么是模板特化2.2 函数模板特化2.3 类模板的实例化2.3.1 全特化2.3.2 偏特化 3、模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4、模板总结 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即…...
C++ this指针
通常情况下,类的成员函数都只涉及一个对象,即调用它的对象。但有时候方法可能涉及到两个对象,在这种情况就需要使用到C的this指针。 class Stock { private: ... double total_val; ... public: double total() const {return total_val;} }…...
解决Sortable拖动el-table表头时,由于选择列造成的拖拽顺序错乱的bug
原因 由于我的表头是由数组循环遍历生成的,而选择列不在数组内,只能在循环外定义el-table-column,造成拖动时索引错乱错误代码 <el-tableheader-dragend"headerDragend"id"out-table":data"state.sliceTable&quo…...
Plantuml之类图语法介绍(十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
深入Docker命令行:探索常用命令和实用技巧
Docker命令行界面是每个容器开发者的得力工具。在这篇文章中,将深入探讨一系列常用的Docker命令,以及一些实用技巧,通过更丰富的示例代码,帮助大家更全面地理解和运用Docker命令行工具。 1. Docker基本命令 1.1 镜像操作 深入了…...
qt 容器QVector,QMap,QHash的常见使用与该迭代器的简单介绍
一. QVector容器是一个动态数组,可以容纳任意数量的元素,在相邻的内存中存储给定的数据类型作为一组数据,在QVector前部或中间位置插入元素都会导致内存中大量的数据元素移动,这使得操作速度会减慢.可使用迭代器对这组数据进行访问. 和其他的容器类型类似,QVector…...
两线制无源 4-20mA 回路供电隔离变送器
两线制无源 4-20mA 回路供电隔离变送器 一入一出两线制无源 4-20mA 回路供电隔离变送器 概述:JSD TAW-1001D-100L-F 系列隔离变送器是 4-20mA 两线制回路供电的电流隔离变送配电器,该隔离变送器采用电磁隔离技术,并通过输入端馈电方式,给输入端两线制仪器仪表设备供…...
强化学习优质博客记录(随缘更新)
杂记 速成深度强化学习的人可能陷入的几个误区(2023-03更新) DQN DQN表现稳定提升和收敛的技巧集锦 TRPO 如何看懂TRPO里所有的数学推导细节? PPO The 37 Implementation Details of Proximal Policy Optimization强化学习算法中,PPO算法是不是就是加了重要…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
