文件操作(总)

1.为什么使用文件

     

a是内存上的一块区域

如果程序退出,则内存回收,数据丢失了,再次运行就看不到上次的数据了

为了持久化保存,我们可以使用文件

2.文件是什么

磁盘上的文件是文件

在程序设计中,文件有两种:程序文件,数据文件

2.1程序文件

1)源文件(.c)

2)目标文件(windows环境后缀为.obj)

3)可执行程序(windows环境后缀为.exe)

2.2数据文件(这里讨论的就是这种)

文件的内容不一定是程序,而是程序运行时读写的数据

如:程序运行需要从中读取数据的文件,或者输出内容的文件

以前所处理的数据的输入输出都是以终端为对象的(从终端的键盘输入数据),运行结果显示到显示器上

我们也会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件

2.3文件名

文件名就是文件标识

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

eg.   c:\code\text.txt

                           

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

二进制文件:

                     数据在内存中以二进制的形式存储,不加转换地输出到外存

文本文件:   

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

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

一个数据在内存中的存储

字符一律使用ASCII形式存储

数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储

测试:

4.文件的打开和关闭

4.1流

流包含各种流,标准流只是一种

我们可以把"流"想象成流淌着字符的河

C程序`针对文件,画面,键盘等的数据输入输出操作都是通过流操作的

一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流然后操作

4.2标准流

我们从键盘输入数据,向屏幕上输出数据并没有打开流的原因是因为C语言程序在启动的时候默认打开了三个流

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

2)stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中

3)stderr - 标准错误流,大多数环境中输出到显示器界面

默认打开了这三个流,我们使用scanf,printf等函数就可以直接进行输入输出操作

三个流的类型是:FILE*,成为文件指针(痛过文件指针找到流,通过流的操作再操作对应的外部设备)

                三个流就是指向文件信息区的指针

scanf读取数据时并没有打开流,直接在标准输入流中读取数据

printf直接输出信息输出到stdout对应的流里面

对于程序来说,文件,光盘,U盘等这些是外部设备

4.3文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”

每个被使用的文件都在文件中开辟了一个相应的文件信息区,用来存放文件的相关信息(文件的名字,文件状态及文件当前的位置),这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明的

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不用关系细节

一般都是通过一个FILE的指针来维护这个FILE结构的变量

文件信息区和将要操作的文件进行关联,想要实现这个就要拿到指向文件信息区的这个指针

FILE* pf;//文件指针变量

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

文件在硬盘里存放                     文件信息区在内存存放

4.4 文件的打开和关闭

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

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系

打开文件

fopen

FILE* fopen ( const  char * filename ,const  char * mode);

                                 文件名                            文件的打开方式

mode:

文件的使用方式:      含义   :                                              如果指定文件不存在:

r”(只读)   为了输⼊数据,打开⼀个已经存在的⽂本⽂件   出错
“w”(只写) 为了输出数据,打开⼀个⽂本⽂件                     建⽴⼀个新的⽂件
“a”(追加) 向⽂本⽂件尾添加数据                                       建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件                 出错
“wb”(只写  为了输出数据,打开⼀个⼆进制⽂件                 建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据                           建⽴⼀个新的⽂件
“r+”(读写) 为了读和写,打开⼀个⽂本⽂件                       出错
“w+”(读写)   为了读和写,建议⼀个新的⽂件                      建⽴⼀个新的⽂件
“a+”(读写)  打开⼀个⽂件,在⽂件尾进⾏读写                  建⽴⼀个新的⽂件
“rb+”(读写) 为了读和写打开⼀个⼆进制⽂件                     出错
“wb+”(读写) 为了读和写,新建⼀个新的⼆进制⽂件           建⽴⼀个新的⽂件
“ab+”(读写) 打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写  建立一个新的文件

 如果这个文件不存在,则会新建一个文件,如果存在,他会把文件里面的内容清空

运行后

关闭文件

fclose

int  fclose ( FILE * stream);

相对:

5.文件的读和写

以读的形式打开文件,就只能读

以写的形式打开文件,就只能写

                                                                            stdin -- 标准输入流

                                                                           的形式打开文件--得到的是一个文件的输入流 

                                                                            stdout

                                                                           的形式打开文件--得到的是文件的输出流

                        

文件的顺序读写

函数名                   功能                                                    适用于

fgetc                字符输⼊函数  ( 字符)                    所有输⼊流
fputc                 字符输出函数  ( 字符)                    所有输出流
fgets                 ⽂本⾏输⼊函数(读字符串)               所有输⼊流              读和写的都是文本信息
fputs                 ⽂本⾏输出函数 (写字符串)              所有输出流
fscanf               格式化输⼊函数                                     所有输⼊流
fprintf               格式化输出函数                                     所有输出流
fread                ⼆进制输⼊                                           ⽂件
fwrite                二进制输出                                           文件                            二进制信息

fputc(将字符写到流里面去)

int  fputc ( int  character , FILE  *  stream );
要写的那个字符

fgetc

int  fgect  (  FILE  *  stream  );
读取正常的时候,返回读取到的字符的ASCII码值
读取失败的时候,会返回EOF
EOF的本质是end  of  file
文件的结束标志

fputs

把一个字符串写到文件里面去(写的时候要自己写'\0',不然文件里面的内容都是在一行上的)

首字符的地址

fgets

从FILE*指向的文件流里去读字符串

区分放进去的还是不放进去的

实际上真正读的是n-1个字符再加上'\0'

如果修改文件内容,在字符串中添加'\0',则读的时候遇到'\0'就不读了(但是'\0'还是会有),也不会再读下一行(即使没有达到字符个数)

解释:如果num=10;

这一行超过10个字符则读九个再加一个'\0',如果不超过9个就换行了,则读到'\0'就停下来了

fwrite

size_t  fwrite ( const  void  *  ptr , size_t  size ,size_t  count , FILE  *  stream ) ;

将ptr中count个大小为size个字节(一个元素的大小)的数据写到文件中

(在流里面写count个size大小的数据到ptr指向的空间里面)

fread

size_t  fread ( void  *  ptr ,  size_t  size , size_t  count , FILE  *  stream ) ;

成功读取几个元素返回几个;小于count则为最后一次了

从文件中读取count个大小为size个字节的数据,存放在ptr指向的空间中

对比一组函数

scanf/fscanf/sscanf

scanf     针对标准输入流的格式化输入函数

int  scanf  (  const  char  *  format, ... ) ;   可变参数列表                                                             

                                                                                   

fscanf    针对所有输入流的格式化输入函数

int  fscanf ( FILE * stream,const  char  *  format,... ) ;

 

sscanf   将格式化的数据转换成字符串

int  sscanf  (  const  char  *  s, const  char  *  format ,...   ) ;

printf/fprintf/sprintf

printf        针对标准输出流得格式化输出函数     

int  printf ( const  char  *  format , ... ) ;

fprintf       针对所有输出流的格式化输出

int  fprintf (  FILE * stream ,  const  char  *  format , ... ) ;

sprintf        是从字符串中提取格式化的数据

                  可以理解为,将字符串转成格式化的数据

int  sprintf (  char  *  str  , const char  *  format  ,... ) ;

6.文件的随机读写

fseek

根据文件指针的位置和偏移量来定位文件指针(根据需要调整指针的位置)

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

                                                偏移量                起始位置

SEEK_SET           文件的起始位置

SEEK_CUR          文件指针当前的位置

SEEK_END           文件的末尾

ftell

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

long  int  ftell ( FILE * stream ) ;

rewind

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

拷贝文件

7.文件读取结束的判定

EOF   --    end  of  file    文件结束的标志

以为feof函数是用来判断文件是否结束的

但是并不是

在读取文件的过程中,有可能读取文件错误

原因:

1.遇到文件末尾

2.遇到错误

文本文件:

fgetc  读取失败会返回EOF

fgets  读取失败或遇到文件末尾会返回空指针

二进制文件:

fread  判断返回值是否小于实际要读的个数

小于count则为最后一次了

8.文件缓冲区

所谓缓冲文件系统是指系统自动地在内存中为每一个正在使用的文件开辟一块“文件缓冲区”,

从内存向磁盘输出数据先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)

缓冲区的大小根据C编译系统决定

结论:因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题

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

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

相关文章

NLP入门——基于TF-IDF算法的应用

从json格式数据中抽出句子和标签 首先查看json格式的数据文件: :~/nlp/tnews/src$ less train.json可以看到json字符串表示一个对象,我们利用json.loads() 函数会将其转换为一个 Python 字典。docs python json #ext.py #encoding: utf-8import sys f…

【并集查找】839. 相似字符串组

本文涉及知识点 并集查找(并差集) 图论知识汇总 LeetCode839. 相似字符串组 如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的,那它们也是相似的。…

现在Java行情不好可以转.net吗?

转向.NET开发可能是一个选择,但要注意以下几点。我这里有一套编程入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 技术转…

闭包、内存泄漏、垃圾回收详解

首先要说清楚这个话题&#xff0c;必须要先清楚什么是垃圾回收&#xff0c;要清楚什么是垃圾回收呢&#xff0c;必须要知道什么是垃圾&#xff0c;所谓的垃圾就是不再需要的内存&#xff0c;需要或者不需要是由人为来决定的 <!DOCTYPE html> <html lang"en"…

STM32的FreeRtos的学习

首先就是去官网下载一个源文件&#xff1a;FreeRtos官网 下载下来的是一个zip文件&#xff0c;解压缩了。 然后再工程文件夹中创建个文件夹&#xff1a; 在这个文件夹中创建3个文件夹&#xff1a; 然后开始把下载下来的文件夹中的文件挑选出来放到我们的工程文件夹中&#xff1…

Kafka多维度调优

优化金字塔 应用程序层面 框架层面&#xff08;Broker层面&#xff09; JVM层面 操作系统层面 应用程序层面&#xff1a;应当优化业务代码合理使用kafka&#xff0c;合理规划主题&#xff0c;合理规划分区&#xff0c;合理设计数据结构&#xff1b; 框架层面&#xff1a;在不…

SPI转四串口芯片CH9434的设计

一、CH9434的介绍 CH9434 是一款SPI转四串口转接芯片&#xff0c;提供四组全双工的9线异步串口&#xff0c;用于单片机/嵌入式系统扩展异步串口。CH9434包含四个兼容16C550的异步串口&#xff0c;最高支持4Mbps波特率通讯。最多支持25 路GPIO&#xff0c;提供半双工收发自动切换…

IO高级 -- 文件操作(Path、Paths、Files)

一、基础&#xff1a;File 1.1 构造方法&#xff1a; 1、 public File(String pathname) &#xff1a;通过给定的路径来创建新的 File实例。2、 public File(String parent, String child) &#xff1a;从父路径(字符串)和子路径创建新的 File实例。3、 public File(File pare…

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 水库大坝监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装…

【机器学习】鸢尾花分类:机器学习领域经典入门项目实战

学习机器学习&#xff0c;就像学习任何新技能一样&#xff0c;最好的方法之一就是通过实战来巩固理论知识。鸢尾花分类项目是一个经典的入门项目&#xff0c;它不仅简单易懂&#xff0c;还能帮助我们掌握机器学习的基本步骤和方法。 鸢尾花数据集&#xff08;Iris Dataset&…

计算机游戏因为d3dcompiler_47.dll丢失无法启动怎么办?解决只要d3dcompiler_47.dll丢失无法启动游戏软件的方法

d3dcompiler_47.dll 是一个动态链接库文件&#xff0c;属于 Microsoft DirectX 的一部分&#xff0c;主要负责编译和运行 3D 图形程序。它是支持 Direct3D 功能的核心组件&#xff0c;Direct3D 是一种用于编程 3D 图形的 API&#xff0c;广泛应用于游戏和图形密集型应用程序中。…

html实现粘贴excel数据,在页面表格中复制

录入数据时&#xff0c;有时候需要把excel中的数据一条条粘贴到页面中&#xff0c;当数据量过多时&#xff0c;这种操作很令人崩溃。本篇文章实现了从excel复制好多行数据后,可在页面粘贴的功能 具体实现代码 <!DOCTYPE html> <html lang"en"> <head…

ArcGIS for js 4.x FeatureLayer 点选查询

示例&#xff1a; 代码如下&#xff1a; <template><view id"mapView"></view></template><script setup> import "arcgis/core/assets/esri/themes/light/main.css"; import Map from "arcgis/core/Map.js"; im…

11.QLoRA微调ChatGLM3-6B

实战 QLoRA 微调 ChatGLM3-6B 大模型 实战 PEFT 库 QLoRA ChatGLM3-6B 微调数据集 AdvertiseGen AdvertiseGen 数据集获取 使用ChatGLM3-6b Tokenizer处理数据 关于ig nore_label_id 的设置&#xff1a; 在许多自然语言处理和机器学习框架中&#xff0c; ig nore_label_id 被…

计算机网络实验(鲁东大学)-cisco-逃课

逃课脚本4-1第二关 以4-1 第二关为例 点开图形化界面&#xff0c;点开工具箱 点复制粘贴 把逃课代码复制粘贴进&#xff0c;点击保存 回到图形化界面&#xff0c;任意位置打开终端 点击shiftctrlv&#xff08;其他方式粘贴进终端也可&#xff09;后敲击回车&#xff0c;在…

[大模型]Phi-3-mini-4k-Instruct Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架&#xff0c;对 Phi-3-mini-4k-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件&#x…

sslh一键在一个端口上运行多个服务(KALI工具系列二十三)

目录 1、KALI LINUX 简介 2、sslh工具简介 3、信息收集 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 监听特定端口 4.2 配置SSH 4.3 配置apache 4.4 配置sshl 4.5 验证配置 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、…

基于线性核函数的SVM数据分类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于线性核函数的SVM数据分类算法matlab仿真&#xff0c;通过程序产生随机的二维数据&#xff0c;然后通过SVM对数据进行分类&#xff0c;SVM通过编程实现&#x…

[大模型]Phi-3-mini-4k-instruct langchain 接入

环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 。 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行演示。 创建工作…

RabbitMQ实践——配置Prometheus和Grafana报表

大纲 启用rabbitmq_prometheus插件安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动配置数据源 在《RabbitMQ实践——在Ubuntu上安装并启用管理后台》中我们已经安装成功RabbitMQ及其管理后台。在此基础上&#xff0c;我们将打通它和Prometheus、Gra…