【让你从0到1学会c语言】文件操作

news/2024/5/18 14:33:35/文章来源:https://blog.csdn.net/m0_69061857/article/details/127310095

作者:喜欢猫咪的的程序员

专栏:《C语言》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》


目录

什么是文件:

我们为什么要使用文件呢?

文件分类:

我们将文件分为以下两种:

程序文件:

​编辑数据文件 :

文件名: 

文件的打开和关闭:

文件指针:

什么是文件指针:

如何定义一个文件指针:

文件信息区前提引入: 

文件的打开和关闭:

fopen函数:

相对入径和绝对入径:

关闭文件:

fclose函数:

 输入流和输出流:

 文件的输入流和输出流可能会出现的问题:

文件的顺序读写:

文件操作函数有哪些呢?如下:

文件的输入和输出流函数(顺序读写):

fgetc函数和fputc函数:

 fgets和fputs函数:

fread函数和fwrite函数:

 我们来对比几个函数:

文件的随机读写:

fseek函数:

ftell函数: 

 rewind函数:

文本文件和二进制文件:

文件读取结束的判定:

feof函数:

文件缓冲区: 



什么是文件:

文件属于文件的一种,与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合。


我们为什么要使用文件呢?

  • 但我们在运行代码时,我们每次都得初始化或者输入数据,这些数据在程序运行完成后也会消失。
  • 在程序运行开始之前或者运行结束之后,数据都没有了,文件这个时候就可以起到至关重要的作用了,它可以为我们存储数据。

文件分类:

我们将文件分为以下两种:

文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

程序文件:

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

如同下图第一个文件:

数据文件 :

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

本章讨论的都是数据文件。


文件名: 

文件名是文件的标识符。

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


文件的打开和关闭:

文件指针:

什么是文件指针:

在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。


如何定义一个文件指针:

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。 


文件信息区前提引入: 

我们文件操作分为3个部分:

  • 打开文件
  • 读文件或者写文件
  • 关闭文件

 当我们在读或者写文件的时候,都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。

我们可以创建一个文件指针: FILE* pf。

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。这样就可以找到与它相关的文件信息区了。


文件的打开和关闭:

  • 文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
  • ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。 

fopen函数:

 第一个参数为文件名,第二个为打开方式。

打开方式有特定的写法,不同的字母有不同的含义,如下图 

  •  当打开方式为r或者r+时,打开前文件必须存在,其他几个如果打开前文件不存在,就会创建一个文件。

详细如下:

  • 返回值:如果返回成功,就返回一个FILE*指针,如果第一个参数(filename)为空的话,就返回一个NULL空指针。
  • 因此就会有存在空指针的风险,所以我们就要在打开文件后,判断是否为空指针。

如何预防空指针如下:


相对入径和绝对入径:

  •  注意:绝对入径原本为"D:\code:\code.txt",但计算机的认知中\会与c结合成\c,成为一个转义字符。所以我们要用一个\来转义例外一个\,因此变为"D:\\code\\code.txt"

关闭文件:

fclose函数:

  •  参数:为文件指针的起始地址。
  • 因为我们一般会将文件指针的地址赋给一个指针,fclose函数只是关闭文件,而并没有将这个指针置为空指针。

 文件的开启和关闭实际运用:


 输入流和输出流:

我们先来看一下我们正常的输入流和输出流。

 我们这边的内存,我们可以理解为计算机或者编译器。

然后我们来看一下文件的输入流和输出流流:

 我们这可以将内存当做计算机,举个例子:使用fgets函数,文件就相当于一般情况下的键盘,我们是将文件中原本存好的数据读取给了计算机(内存),所以fopen要写为r。


 文件的输入流和输出流可能会出现的问题:

在了解输入流和输出流函数前,我们首先得了解一个地方,不然程序会出现问题。都是博主经历过的血与泪!!!

  • 当我们要输入时:我们应该要将打开文件fopen函数中的打开方式改为“r”或者其他与写有关的。
  • 当我们要输出时:我们应该要将打开文件fopen函数中的打开方式改为“w”或者其他与读有关的。

了解完这个后,我们来了解一下输入流和输出流函数!


文件的顺序读写:

文件操作函数有哪些呢?如下:

我们来了解一下这些函数。


文件的输入和输出流函数(顺序读写):

  • 以下函数的头文件都为#include<stdio.h>

fgetc函数和fputc函数:

 实际运用:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{//打开文件//相对入径FILE* pf=fopen("test.txt", "r");//绝对入径//FILE* pf=fopen("D:\\code\\code.txt", "w");if (pf == NULL){//fopen函数的返回值是file*的,可能会传回来空指针,所以要判断一下。perror("fopen");return 1;}// 写文件fputc('a', pf);fputc('b', pf);fputc('c', pf);int i = 0;/*for (int i = 0; i < 26; i++){fputc('a' + i, pf);}*///int ch = fgetc(pf);//printf("%c ", ch);/*for (int i = 0; i < 26; i++){int ch = fgetc(pf);printf("%c ", ch);}*///结束文件fclose(pf);//这个不会将pf设为空指针,我们要将pf设为空指针pf = NULL;return 0;
}

 运行结果:


 fgets和fputs函数:

 如何运用:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//打开文件char*pf=fopen("test.txt", "r");if (pf == NULL){perror("fopen:");return 1;}//写文件char ch[20]="qqqq";fgets(ch, 20, pf);printf("%s\n", ch);//关闭文件fclose("test.txt");pf = NULL;return 0;
}

 运行结果:

 fputs函数我就不讲如何使用了,就是记得把fopen函数的r改为w。


fread函数和fwrite函数:

fread函数:

参数:

  • ptr为指向大小至少为(size*count)字节的内存块的指针,转换为 void*。
  • size为每个元素的大小。
  • count为个数
  • stream为文件指针。

用处:

  • 从输入流中读取数据到内存到内存
  • 流的位置指示器按读取的字节总数前进。
  • 如果成功,读取的总字节数为(大小*计数)。

返回值

  • 返回值为size_t类型。返回成功读取的元素总数。
  • 如果此数字与 count 参数不同,则表示读取时发生读取错误或到达文件末尾。
  • 如果大小或计数为零,则该函数返回零,并且 ptr 所指向的流状态和内容保持不变。

 fwrite函数:

参数: 

  • ptr为指向指向要写入到文件的元素数组的指针。
  • size为要写入的数组每个元素的内存大小。
  • count为个数
  • stream为文件指针

用处:

  • 将元素数组从计算机(内存)写到文件。
  • 流的位置指示器按写入的总字节数前进。
  • 在内部,该函数将 ptr 所指向的指针解释为一个无符号 char 类型的(大小*计数)元素数组,并按顺序将它们写入输出流,就好像为每个字节调用了 fputc 一样。

返回值:

  • 为size_t类型
  • 如果成功,就返回写入元素的个数

  • 如果返回值与count的值不一样,就会报错

  • 如果大小或计数为零,则该函数返回零,

 实际运用:

这里要注意:

  • 如果是要写二进制文件,fopen的打开方式不能写r或者w,要写wb或者rb。
  • fread和fwrite函数不仅能用在文本文件还可以运用在二进制文件,而其他几个只能运用在文本文件。

 我们来对比几个函数:

scanf/fscanf/sscanf       

printf/fprintf/sprintf

  显而易见,上图蓝色部分是相同的,而红色部分不一样。

 我们对比一下,发现printf函数和scanf函数加个f。多的那个变量为文件指针。例如:fprintf函数就是将变量从内存按照一定的格式输出到数据(文件)中。fscanf也是同样的道理。

而我们可以将变量以一定格式转换输入输出到数据,那我们是否可以将这些格式化的数据变回原来的格式呢?

答案是可以的,就是运用上图下面两个函数(sprintf函数和sscanf函数)。

如何运用呢?如下:

我们在一些网站或者平台(前端)注册的时候,要填写一些数据,这些数据就是字符串,我们就可以运用sscanf函数和sprintf函数来运用。 


文件的随机读写:

fseek函数:

 参数:

  • 第一个参数为文件指针

  • 第二个为偏移量

  • 第三个为偏移量的起始位置

    SEEK_SET为文件起始位置

    SEEK_CUR为文件某个指定位置

    SEEK_END为文件结尾位置 

 实际运用:


ftell函数: 

ftell函数是返回文件指针相对于起始位置的偏移量。

参数:stream为文件指针。

返回值为:为long int型 

实际运用:


 rewind函数:

让文件指针的位置回到文件的起始位置

实际运用: 

/* rewind example */
#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);buffer[26]='\0';puts (buffer);
return 0;
}

文本文件和二进制文件:

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

一个数据在内存中是怎么存储的呢?

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


文件读取结束的判定:

feof函数:

  • 应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束 
  • 而不是文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束

文件缓冲区: 

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

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_23986.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rbf神经网络和bp神经网络,rbf神经网络百度百科

1、rbf神经网络算法是什么? RBF神经网络算法是由三层结构组成&#xff0c;输入层至隐层为非线性的空间变换&#xff0c;一般选用径向基函数的高斯函数进行运算&#xff1b;从隐层至输出层为线性空间变换&#xff0c;即矩阵与矩阵之间的变换。 RBF神经网络进行数据运算时需要…

基于springboot的旅游打卡攻略分享小程序

&#x1f496;&#x1f496;作者&#xff1a;IT跃迁谷毕设展 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等。平常会做一些项目定制化开发…

预处理的补充知识

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录一、宏的补充知识1.1 宏定义充当注释…

MABSA(Multimodal Aspect-Based Sentiment Analysis)2022ACL 预训练

大致浏览&#xff0c;没有细看。 论文题目&#xff08;Title&#xff09;&#xff1a; Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis 研究问题&#xff08;Question&#xff09;&#xff1a;多模态情感分析 MABSA (Multimodal Aspectased S…

黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day14-面向对象进阶02

1、权限修饰符和代码块 1.1 权限修饰符 权限修饰符&#xff1a;是用来控制一个成员能够被访问的范围的。 可以修饰&#xff1a;成员变量、方法、构造方法、内部类。 巧计举例&#xff1a; private--------私有的----------相当于私房钱&#xff0c;只能自己用 默认--------…

LVS+KeepAlived高可用负载均衡集群

内容预知 1. 高可用群集的相关知识 1. 1 高可用&#xff08;HA&#xff09;群集与普通群集的比较 普通群集 高可用群集(HA) 1.2 KeepAlive 高可用方案 1.3 KeepAlived的体系模块 1.4 Keepalived实现原理 2. 高可用群集的脑裂现象及预防措施 2.1 高可用集群的脑裂现象及其…

树莓派学习笔记

记录一下树莓派的使用,包含操作系统、linux命令、python、硬件等知识。参考《树莓派开发实战》树莓派简介及型号 树莓派(Raspberry Pi)是一款基于 Linux 系统的、只有一张信用卡大小的卡片式计算机,树莓派已经成为基于 Linux 的低成本电脑和嵌入式计算机平台这个领域中的重…

Material UI – React (2022) 版的完整教程

Material UI – React (2022) 版的完整教程 这是关于 Material UI 的最期待的课程。该课程涵盖了 Material UI 的所有组件 课程英文名&#xff1a;Material UI - The Complete Guide With React (2022) Editio 此视频教程共5.5小时&#xff0c;中英双语字幕&#xff0c;画质…

【贝塞尔曲线拟合】

贝塞尔曲线拟合问题描述拟合曲线生成过程参考程序注意事项问题描述 已知一条n阶贝塞尔曲线L(P0,P1,P2,P3,...,Pn)L(P0, P1, P2, P3, ..., Pn)L(P0,P1,P2,P3,...,Pn)&#xff08;P0P0P0为起点&#xff0c;P1P1P1为第一个控制点&#xff0c;P2P2P2为第二个控制点&#xff0c;P3P…

Mysql删除重复数据只保留一条

&#xff08;1&#xff09;以这张表为例&#xff1a; CREATE TABLE test (id varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 注解id,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 名字,PRIMARY KEY…

队列的顺序存储结构

说白了,就是一个数组 ,然后在两端进行操作 ,两端用首队指针和尾指针分别指向 ,然后进行相关的删除,插入操作, 目的还是模拟现实对数据的处理 ●描述队列 •数据元素data , 元素具有同一类型ElemType ,最多为MaxSize(数组容量) •当前队首front •当前队尾 rear 定义队列的数据…

RK3588安装部署openmediavault

RK3588安装部署openmediavault部署准备Debian 10 文件系统编译和获取安装 openmediavault安装基础依赖安装 openmediavault 原秘钥环添加 openmediavault 官方原安装 openmediavault 基础依赖安装 openmediavaultopenmediavault 相关资料&#xff1a; https://docs.openmediav…

YOLOX 学习笔记

笔记来源&#xff1a;https://www.bilibili.com/video/BV1jo4y1D7CF/?vd_source2ed6e8af02f9ba8cb90b90e99bd4ccee 近年来&#xff0c;目标检测的工程应用研究中&#xff0c;YOLO系列以快速响应、高精度、结构简单以及容易部署的特点备受工程研究人员的青睐。同时&#xff0c;…

3. HDFS分布式文件系统

3.1 HDFS简介 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文件&#xff0c;这就是分布式文件管理系统。HDFS只是分布…

CloudlaC是什么?

目录1. CloudIaC的简介2. 部署安装2.1 下载并解压安装包2.2 安装并启动Docker2.3 安装并启动Mysql2.4 安装并启动 Consul2.5 编辑配置文件2.6 初始化MySQL2.7 安装iaC服务2.8 启动 IaC 服务2.9 拉取 ct-worker 镜像2.10 下载前端部署包并解压2.11 安装nginx并配置2.12 访问web页…

【笔试刷题训练】day_04

选择题 C/C中各种进制的表示方法 二进制&#xff1a;在数字的末尾加b&#xff0c;如101010b 八进制&#xff1a;在数字前面加数字0&#xff0c;如0123 十进制&#xff1a;数字本身&#xff0c;如123 十六进制&#xff1a;数字前面加0x 或者 数字后面加h&#xff0c;如0x123、12…

字节跳动C++云原生二面(65min)

字节跳动C云原生二面&#xff08;65min&#xff09; 面试问题 HTTP1.0 、1.1和2.0 的区别和差异是什么 《HTTP1.0和1.1的区别》HTTP1.1 默认开启长连接&#xff08;keep-alive&#xff09; 而HTTP1.0需要添加参数&#xff0c;在一定程度上减少了建立和关闭连接的消耗和延迟HT…

AntDesign-Vue Table 查询与分页

前言 之前的增删改查小 Demo 已经快要进行到最后一步了,这节的任务是将请求数据的方式改为 分页,并且增加 分页条件查询 的功能。 页面布局 <a-table:data-source="dataSource":columns="columns":pagination="pagination" > <!-- ↑…

02 docker安装

这里写目录标题CenterOS安装使用远程镜像仓库安装设置yum远程仓库第二步&#xff1a;安装docker安装第三步&#xff1a;docker镜像加速器debian/Ubuntu安装docker官网&#xff1a;https://www.docker.com/ docker镜像库&#xff1a;https://hub.docker.com/ Docker CE&#xf…

truffle安装问题-无法加载文件

在powershell 下输入以下命令 set-executionpolicy remotesigned问题解决搜索 复制