初学c语言21(文件操作)

article/2025/7/27 2:49:50

一.为什么使用文件

之前我们写的程序的数据都是存储到内存里面的,当程序结束时,内存回收,数据丢失,

再次运行程序时,就看不到上次程序的数据,如果要程序的数据一直保存得使用文件

二.文件

文件一般可以分为俩种:

1.程序文件

包括源程序文件(后缀为 .c)、目标文件(Windows环境下后缀为 .obj)、可执行程序(Windows环境下后缀为 .exe

2.数据文件

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

三.数据在文件中是怎么存储的?

数据在内存是以二进制形式存储,而在文件中:

字符一律按ASCLL码值形式存储

数值型数据既可以以ASCLL码值形式存储,也可以以二进制形式存储

举例:

如10000,以ASCLL码值形式存储到磁盘,在磁盘上占5个字节(一个字符一个字节),以二进制形式存储,占4个字节,图像如下:

四.二进制文件和文本文件

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

以ASCLL码值形式存储的文件为文本文件

五.流和标准流

1.流

程序的数据要输出到各种设备,也需要从外部设备获取数据,由于设备的不同导致输入输出操作不同,为了方便就有了流的概念,c程序对文件、键盘等进行输入输出操作都是通过流操作的

一般情况下,向流中输入输出数据都是先打开流,在进行操作

2.标准流

之前的scanf函数从键盘输入信息、primtf函数向屏幕输出信息等却没看见打开流,是因为c程序在启动的时候默认打开了三个流:

stdin ---标准输入流,大多数环境下从键盘上输入,scanf就是从标准输入流中读取数据的

stdout ---标准输出流,大多数环境下从屏幕上输出,printf就是将信息输出到标准输出流中

stderr ---标准错误流,大多数环境下从屏幕上输出

六.文件指针

每打开一个文件,系统就会根据文件情况自动创建FILE结构体变量,并填充其中的信息,一般都是通过一个FILE的指针来维护其结构变量,即文件指针,该指针可以找到与它关联的文件

七.文件的打开和关闭

文件在读写前应该打开文件,使用结束后关闭文件,不然会造成内存泄漏,数据丢失等

ANSIC规定使用fopen打开文件,fclose关闭文件

1.fopen

形式:

功能:

打开fileaname指定的文件,同时将文件和一个流进行关联,后续对流的操作是通过函数返回的指针进行维护的(如fputc、fputs等),具体对流(关联的文件)的操作是通过参数mode来指定的

参数:

filename:表示打开文件的名字,可以是相对路径,也可以是绝对路径

mode:表示打开文件的操作方式

返回值:

打开文件成功返回一个指向FILE结构体的指针,通过操作流(统一接口)指向文件信息区,关联到此文件

失败时返回NULL,所以每次打开文件都要检查是否打开成功

文件打开方式(mode参数)

模式描述文件存在文件不存在
“  r  ”只读正常打开文件返回NULLL
“ w ”只写(覆盖)清空文件类容创建新文件
" a "追加写入(从末尾)从末尾写入创建新文件
" r+ "读写(从开头)正常打开文件返回NULL
" w+ "读写(覆盖)清空文件类容创建新文件
" a+ "读写(追加)从末尾写入创建新文件
"rb""wb"等二进制模式(加b)同上同上

2.fclose

形式:

功能:

关闭参数steam关联的文件,并取消其关联关系。与该流关联的内部缓冲区解除关联并刷新(将为写入磁盘的输入缓冲区的类容写入,将未读取的输出缓冲区的类容丢弃)所以文件指针会变为野指针,得及时置为NULL

参数:

steam:指向要关闭文件流的FILE结构体的指针

返回值:

关闭成功返回0,否则返回EOF

应用举例:

.  ----表示当前路径

..  ----表示上一级路径

/ ----表示分割目录层级

相对文件举例:data.txt(表示当前路径的data.txt)或(./../data.txt)

绝对路径举例:C:\Users\xxx\Desktop

八.文件的顺序读写

函数名功能适用于
fgetc从输入流读取一个字符所有输入流
fputc向输出流写入一个字符所有输出流
fgets从输入流读取一个字符串所有输入流
fputs向输出流写入一个字符串所有输出流
fscanf从输入流读取带有格式的数据所有输入流
fprintf向输出流写入带有格式的数据所有输出流
fread从输入流读取一块数据文件输入流
fwrite向输出流写入一块数据文件输出流

1.fputc

形式:

功能:

将参数character指定的字符写入到stream指定的输出流里,字符会被写入内部指示器当前指向的位置(如有字符将被覆盖),写入后指示器向前移动一个位置

参数:

character:被写入的字符

steam:指针,指向了输出流

返回值:

写入成功返回写入的字符(int形式的)

失败时返回EOF(通常为-1)

应用:

2.fgetc

形式:

功能:

从参数stream指定的输入流读取字符,读取当前指示器指向的字符后,指示器也会向前移动一个位置

参数:指针,指向了输入流

返回值:

读取成功时返回读取的字符(int类型的)

读取失败或读取到文件末尾时返回EOF

应用:

2.feof和ferror

feof

形式:

功能:

检测stream指针指向的流是否遇到了文件末尾。如果在读取文件到末尾的时候,读取就会停止,这时读取函数就会在对应的流上设置一个文件结束的指示符,这个指示符会被 feof() 检测到,如果检测到指示符就返回非0的值,否则返回0

ferror

形式:

功能:

检测stream指针指向的流是否读/写错误。如果读/写错误,文件读写就会停止,读写函数就会在对应的流上设置一个错误指示符,这个指示符会被ferror检测到,被检测到指示符被设置就会返回非0的值,否则返回0.

应用:

3.fputs

形式:

功能:

将str指向的字符串写入到stream指向的输出流里(不包括文件的控制符\0

参数:

str:指针,指向要写入的字符串(必须以\0结尾)

stream:指针,指向输出流

返回值:

成功时返回非负数

失败时返回EOF

应用:

4.fgets

形式:

功能:

从stream指定的输入流读取字符串,直至读到换行符、文件末尾、指定字符数(包括结尾\0),然后将读取的字符串存储到str指向的空间里

参数:

str:指向字符数组的指针,用来存储读取的字符

num:最大读取字符数(实际最多读取num-1个,每次读取都会在结尾加\0

stream:指针,指向输入流

返回值:

成功时返回str

读取到文件末尾或读取错误时返回NULL

应用:

5.fprinrf

形式:

功能:

将格式化数据输出到stream指定的流里

参数:

stream:指针,指向要写入的文件流里

format:格式化字符串(%d、%f等)

....  :提供与格式化字符串中说明符

返回值:

成功时返回写入字符个数

失败时返回负值

应用:

6.fscanf

形式:

功能:

从stream指定的文件流中读取格式化数据的函数

参数:

stream:指针,指向输入流

.... :可变参数列表,提供存储数据的地址

其他和scanf一样

返回值:

成功时返回成功填充到可变参数列表的项数,但可能少于预期,有如下原因:

格式化字符与数据不匹配

读取发生错误

在读取成功前读到文件末尾或读取错误返回EOF

应用:

7.fwrite

形式:

功能:

将ptr指向的数据块(可控制)写入到stream指向的输出流里(以二进制写入,所以得在使用前已二进制可写方式打开

参数:

ptr:指针,指向要写入的数据块

size:要写入每个数据块的大小(单位字节)

num:要写入数据项的数量

stream:指针,指向了要写入的文件输出流

返回值:

返回写入的项数

应用:

8.fread

形式:

功能:

从stream指定的文件输入流中读取数据块(读取二进制形式文件

参数:

ptr:指针,指向存储读取的数据的空间

size:要读取每个数据块的大小

count:读取数据块的总量

stream:指针,指向要读取数据的文件流

返回值:

读取的项数

应用:

9.sprintf

形式:

功能:

将格式化数据转化为一个字符串

参数:

str:指针,指向存储生成的字符串

返回值:

成功时返回存储的字符数(不包括\0)

失败时返回负值

应用:

10.sscanf

形式:

功能:

从字符串读取格式化数据

参数:

s:指针,指向要读取的字符串

返回值:

成功时返回解析成功并赋值的项数

失败时返回EOF

应用:

九.文件的随机读取

1.fseek

形式:

功能:

调整文件指示器的位置,可以从想读/写的位置读/写

参数:

stream:指针,指向一个流(如文件流)

origin:文件指示器的初始位置,可设置,有以下可能取值:

offset:相对于origin的偏移量

应用:

2.ftell

形式:

功能:

返回文件指示器相对于起始位置的偏移量

应用:

3.rewind

形式:

功能:

是文件指针回到起始位置

十.文件缓冲区

系统会自动在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据先会送到文件缓冲区,装满后才一起送到磁盘上.

所以在读写模式下,写完后再读,可能数据还没输出到文件,导致读不到数据,以下有个函数可以刷新文件缓冲区,能及时读到数据,

fflush

形式:

功能:

强制刷新stream指定流的缓冲区,但对输入流未定义

参数为NULL时刷新所有打开的输出流

返回值:

成功时返回0,失败时返回EOF

证明代码:

#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
int main()
{FILE* pf = fopen("dtat.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开dtat.txt文件,发现文件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush 在⾼版本的VS上不能使⽤了printf("再睡眠10秒-此时,再次打开dtat.txt文件,文件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}


http://www.hkcw.cn/article/dXRTFkcbeq.shtml

相关文章

回车键为什么叫做“回车键”?

Enter键&#xff0c;也就是 “回车键”&#xff0c; 大家应该都不陌生。 可你知道它为什么叫“回车键”&#xff0c; 而不叫“输入键”、“登记键”嘛&#xff1f; 这要从机械英文打字机说起 因为电脑的普及&#xff0c;打字机几乎消失匿迹。 有的小伙伴们也许在小时候用过…

以太联Intellinet 分享:PoE 技术在医疗保健行业的创新应用

在当今科技飞速发展的时代&#xff0c;物联网(IoT)在医疗领域的应用正呈现出蓬勃兴起的态势。全球各地的医院以及老年生活中心纷纷引入物联网智能医疗解决方案&#xff0c;以实现设施运营的高效化与智能化。而在这背后&#xff0c;以太网供电(PoE)技术发挥着关键作用&#xff0…

大语言模型的技术原理与应用前景:从Transformer到ChatGPT

目录 摘要 1. 引言 2. Transformer架构核心原理 2.1 自注意力机制 2.2 位置编码 2.3 前馈神经网络 3. 从GPT到ChatGPT的演进 3.1 GPT系列模型架构 3.2 训练流程优化 4. 应用场景与案例分析 4.1 代码生成 4.2 文本摘要 4.3 问答系统 5. 挑战与未来方向 5.1 当前技…

CSS Day06

1.定位-相对和绝对和固定 (1)相对定位 position: relative; top: 100px; left: 200px; &#xff08;2&#xff09;绝对定位 就是子选择则器要用绝对定位&#xff0c;父选择器要用相对定位。 如果没有遵守此规则&#xff0c;那么小标签会跑到浏览器最角落&#xff1a; &#…

2025年5月24号高项综合知识真题以及答案解析(第1批次)

2025年5月24号高项综合知识真题以及答案解析

PowerDesigner通过SQL反向生成类图

PowerDesigner通过SQL反向生成类图 背景操作步骤步骤1: 选择这个步骤2: 目前我是选择的这个步骤3: 选择这个 其他 背景 工作学习 操作步骤 步骤1: 选择这个 步骤2: 目前我是选择的这个 步骤3: 选择这个 其他 其他同事告诉我的, 我还没有亲自尝试, 应该问题不大. 尝试后再反…

驱动灯珠芯片LT3743手册理解

1.引脚功能 1.EN/UVLO EN/UVLO引脚用作启用引脚&#xff0c;可在1.55V时开启内部电流偏置核心和子稳压器。该引脚没有上拉或下拉功能&#xff0c;因此正常工作需要电压偏置。当电压降至约0.5V时&#xff0c;系统将完全关闭。即EN/UVLO引脚的输入电压在1.55V至6V之间即可。 2.…

在 Mac 下 VSCode 中的终端使用 option + b 或 f 的快捷键变成输入特殊字符的解决方案

前言 在终端里&#xff0c;我们可以使用 option b 和 option f 来在我们输入的命令中进行快速的前后调整光标&#xff0c;但是&#xff0c;在未设置的情况下&#xff0c;在 MacOS 中&#xff0c;会变成输入特殊字符。 普通键盘上是 alt b 和 alt f &#xff0c;只是叫法不…

晨控CK-FR08与西门子PLC配置Profinet通讯连接操作手册

晨控CK-FR08与西门子PLC配置Profinet通讯连接操作手册 晨控CK-FR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围绕CK…

【高能计算机】海思主板的特点和应用

在科技飞速发展的今天&#xff0c;主板作为电子设备的核心组件&#xff0c;其性能和功能直接影响着整个系统的运行效率和稳定性。继飞腾主板和龙芯主板的出现之后&#xff0c;高能计算机作为中国工控主板的研发生产商&#xff0c;紧跟时代发展的步伐&#xff0c;又推出一款海思…

从认识AI开始-----解密LSTM:RNN的进化之路

前言 我在上一篇文章中介绍了 RNN&#xff0c;它是一个隐变量模型&#xff0c;主要通过隐藏状态连接时间序列&#xff0c;实现了序列信息的记忆与建模。然而&#xff0c;RNN在实践中面临严重的“梯度消失”与“长期依赖建模困难”问题&#xff1a; 难以捕捉相隔很远的时间步之…

基于javaweb的JSP+Servlet家政服务系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

银行数字化应用解决方案

行业背景 银行业数字化转型已成为大势所趋&#xff0c;新技术浪潮为银行带来巨大的创新机遇&#xff0c;移动互联催生全新的用户体验需求&#xff0c;大数据应用带来深刻的客户洞察。但错综复杂的业务场景、严格的监管和合规要求、复合型人才的匮乏等问题&#xff0c;严重制约…

视频加密技术和防翻录技术有哪些?

更新&#xff1a;问答播放器的截图效果。 摘要&#xff1a;视频加密技术通过分布式编码、切片加密、动态水印等手段保护内容安全&#xff0c;防止盗录和二次分发。主流方案包括&#xff1a;1&#xff09;VRM12采用混合算法加密与密码本混淆&#xff1b;2&#xff09;H5优化HLS机…

嵌入式开发学习日志(linux系统编程--进程(4)——线程锁)Day30

扩&#xff1a;typedef三种用法&#xff08;简化代码编写&#xff09; 一、线程的控制——互斥和同步 &#xff08;一&#xff09;实例引入 1、示例&#xff1a; 运行结果&#xff1a; 两个线程都在运行&#xff0c;出现问题原因&#xff1a;资源竞争&#xff08;对全局变量都…

从图像处理到深度学习:直播美颜SDK的人脸美型算法详解

在直播的镜头前&#xff0c;每一位主播都希望自己“光彩照人”。但在高清摄像头无死角的审视下&#xff0c;哪怕是天生丽质&#xff0c;也难免需要一点技术加持。于是&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台提升用户粘性和视觉体验的重要工具。 尤其是在“人脸美…

编译rustdesk,使用flutter、hwcodec硬件编解码

目录 安装相应的环境安装visual studio安装vpkg安装rust开发环境安装llvm和clang编译源码下载源码使用Sciter作为UI的(已弃用)使用flutter作为UI的(主流)下载flutter sdk桥接静默安装最近某desk免费的限制越来越多,实在没办法,平时远程控制用的比较多,只能用rustdesk了,…

Dynamics 365 Business Central EC Sales List 欧洲共同体 (EC) 销售列表

什么是EC Sales List? 是在欧盟境内 开立的具有增值税主体公司的一项报告义务&#xff0c;提供欧盟国家/地区企业之间的跨境交易记录。ESL 的目的是确保这些交易中的所有相关方都支付和申报了适当金额的增值税。 随着出海企业越来越多的在欧州开展业务&#xff0c;此项报告需…

将图片存为二进制流到数据库并展示到前端的实现

使用图片直接存储到数据库中可能会出现以下问题&#xff1a; 1.图片的存储太多了占用数据库的存储空间 2.图片占用内存较大在传输和渲染的情况下会影响应用性能 3.一般情况下是将图片上传云服务器然后数据库存地址&#xff0c;这里讲解的情况只适合图片较少的情景 这里使用…

pikachu通关教程-RCE

目录 RCE(remote command/code execute)概述: exec "ping" 管道符 乱码问题 RCE(remote command/code execute)概述: RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统 分为远程代码和远程命令两种.当…