文件操作知识点

news2024/12/23 12:39:34

前言:  我们应该知道一般程序运行时产生的数据是存放在内存中的。但是如果程序关闭后这些内存就会被系统回收,如果内存内的有用的数据没有被保存下来,这些数据就丢失了。所以这个时候我们就可以使用磁盘来储存我们的数据。

目录

程序文件的分类

文件名

 二进制文件和文本文件

文件的打开和关闭 

流的概念: 

标准流:

文件打开和关闭 

文件的顺序读写函数:

fseek 

ftell 

rewind

 文件读取结束的判定

文件缓冲区的概念


程序文件的分类

程序文件一般分为两类:程序文件和数据文件。

程序文件: 源代码(.c文件) 、目标文件(.obj) 、 可执行程序(.exe)

数据文件:用于保存数据的文件。 区别于用来运行程序的程序文件。 

文件名

每个文件都有一个路径和名称, 这是用来寻找该文件的途径。 便于用户使用。

文件名一般包含三个部分: 文件路径, 文件主干, 文件后缀

 二进制文件和文本文件

 一个数据,我们都知道数据在计算机中是以二进制的方式进行储存, 如果这个数据从计算机中不加转换的就输出到外存的文件中, 就是二进制文件。 

但是如果这个数据转换成ASCII码的形式, 那么就是文本文件。 

字符一律通过ASCII码的形式进行储存, 数值则ASCII和二进制储存皆可。

比如10000这个数值, 如果用ASCII就花费五个字节, 但是用二进制就只需要4个字节。 

文件的打开和关闭 

流的概念: 

程序数据进行输出到外部设备时, 以及程序的数据从外部设备获取数据时, 不同的外部设备的输入输出操作是各不相同的。 为了方便对各种设备进行方便的操作呢, 人们抽象出了流的概念。 可以将其抽象成一条充满字符的河。

我们通过向这条河中写数据, 或者从这条河中拿数据, 这就是数据的输入和输出。 

标准流:

我们打开一个程序, 那么我们就默认打开了三个流

一个是标准输入流stdin:标准输⼊流,scanf就是从标准输入流读取数据。 

一个是标准输出流stdout: 标准输出流, printf就是将数据输出到标准输出流中。

一个是标准错误流stderr:用于输出错误信息。

三个流的类型是FILE*, 通常称为文件指针。 

文件打开和关闭 

在文件读写之前应该打开文件,在文件读写之后应该关闭文件。  

在我们打开文件之后, 都会返回一个FILE*类型的指针指向该文件, 就建立了文件和指针之间的练习。

打开文件函数:

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

关闭文件函数:

int fclose( FILE* stream);

其中mode为文件的打开方式。

有以下几种打开方式:

⽂件使⽤⽅式含义如果指定⽂件不存在
“r”(只读)为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
“w”(只写)为了输出数据,打开⼀个⽂本⽂件建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件出错
“w+”(读写)为了读和写,建议⼀个新的⽂件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

文件的顺序读写函数:

fgetc()                        字符输入函数                      所有输入流

fputs()                        字符输出函数                      所有输出流

fgets()                        字符串输入函数                   所有输入流

fputs()                        字符串输出函数                  所有输出流

fscanf()                      格式化输入函数                  所有输入流

fprintf()                       格式化输出函数                  所有输出流

fread()                        二进制输入函数                  文件

fwrite()                       二进制输出函数                   文件

上述得所有所有输入流包括标准输入流和其他输入流(如文件输入流), 上述的所有输出流包括标准输出流和其他输出流(如文件输出流)。 

fseek 

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

fseek是根据流的初始位置和偏移量来定位一个文件指针位置。

以下为实例:

int main()

{

        FILE* Open = fopen("text", "wb");

        fputs("hello world", Open);

        fseek(Open, 5, SEEK_SET);

        fputs("earth", Open);

        fclose(Open);

        return 0;

} 

ftell 

long int ftell ( FILE * stream );

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

下图为实例:

int main()

{

        FILE* Open;

        long size;

        Open = fopen("text", "rb");

        if(Open == NULL)

        {

                exit(-1 );

         }

        fseek(Open, 0, SEEK_END);

        size  =  ftell(Open);

        fclose(Open);

        printf("%d", size);

}

rewind

void rewind (FILE* stream);

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

以下为实例:

int main()

{

        FILE* Open = fopen("text", "w+");

        char arr[27];

        for(int n = 'A'; n <= 'Z'; n++)

        {

                fputc(n, Open);

        }

        rewind(Open);

        fread(arr, 1, 26, Open);

        fclose(Open);

        arr[26] = '\0';

        puts(arr);

        return 0;

} 

 文件读取结束的判定

应该要牢记, 判断文件是否读取结束不要直接使用feof。

feof的作用是:当文件读取结束的时候, 判断文件读取结束的原因是不是文件到了末尾。 

当读取文本文件时, 判断返回值:EOF(fgetc)或者NULL(fgets)。

当读取二进制文件时, 判断返回值是否小于实际要读取的个数。

文件缓冲区的概念

ANSIC标准采用缓冲文件系统处理数据文件的。缓冲文件系统就是指,系统自动的在内存中为程序中的每一个正在使用的文件开辟一块”文件缓冲区”,从内存向磁盘输入数据应该先通过文件缓冲区, 等到文件缓冲区满了再一起送到磁盘上。如果是磁盘向计算机读入数据,则从磁盘文件中读取数据到文件缓冲区, 然后等到满了再一起读到计算机内存中。 

int main()

{

        FILE*pf = fopen("text", "w");
        fputs("abcdef", pf);
        printf("正在写数据,这时候我们可以打开⽂件,因为要观看是否写上内容,因为有10秒缓冲。但是我们发现⽂件没有内容。\n");
        Sleep(10000);
        printf("刷新缓冲区\n");
        fflush(pf);//这个时候其实写上了。
        printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");
        Sleep(10000);
        fclose(pf);//刷新缓冲区
        pf = NULL;
        return 0;
}

因为有缓冲区的存在, c语言操作文件的时候, 需要做刷新缓冲区或者再文件操作结束的时候关闭文件。 否则可能导致读写文件的问题。 

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

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

相关文章

Jenkins 流水线(Pipeline)详解

大家好&#xff0c;Jenkins 流水线&#xff08;Pipeline&#xff09;是一种可编排的持续集成和交付&#xff08;CI/CD&#xff09;方法&#xff0c;它以代码的方式定义整个软件开发过程中的构建、测试和部署流程。接下来就跟大家分享一下Jenkins 流水线&#xff08;Pipeline&am…

MySQL:图文超详细教程MySQL5.7下载与安装

一、前言 MySQL 5.7 是一个重要的数据库管理系统版本&#xff0c;它带来了多项改进和新特性&#xff0c;本文将超详细的带大家手动安装一下MySQL5.7。 二、下载MySQL5.7版本 MySQL5.7安装包 链接&#xff1a;https://pan.baidu.com/s/1lz5rp9PwfyeHzkEfI_lW6A 提取码&#…

基于小波分析和机器学习(SVM,KNN,NB,MLP)的癫痫脑电图检测(MATLAB环境)

癫痫是一种由大脑神经元突发性异常放电导致的大脑功能性障碍疾病。据世界卫生组织统计&#xff0c;全球约有7000万人患有癫痫。癫痫患者在发病时呈现肌肉抽搐、呼吸困难、意识丧失等症状。由于癫痫发作的偶然性&#xff0c;患者极有可能在高空、驾驶、游泳等危险情况下发病并丧…

基于混合Transformer-CNN模型的多分辨率学习方法的解剖学标志检测

文章目录 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model摘要方法实验结果 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model 摘要 精确定位…

数据分析实战:从0到1完成数据获取分析到可视化

文章目录 1.数据分析基本流程1.1 数据采集1.2 数据提炼1.3 数据探索分析 2.数据获取的方法和工具2.1 数据解锁器2.2 爬虫浏览器2.3 数据洞察市场 3.完整案例分析&#xff1a;从数据采集到数据可视化3.1 直接按需定制数据集获取数据3.2 获取IP代理&#xff0c;利用python爬取数据…

JavaScript Window对象

一、BOM&#xff08;浏览器对象模型&#xff09; window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象。 像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的。 所有通过var定义在全局作用域中的变量、…

WindowsLinux环境下Spring Boot启动和关闭脚本

GitHub&#xff1a;SpringBootDemo Gitee&#xff1a;SpringBootDemo 微信公众号&#xff1a; 如果我们Spring Boot服务直接部署在Windows或Linux环境下&#xff0c;如果我们启动或关闭服务&#xff0c;需要频繁手敲命令&#xff0c;很不方便。 此时&#xff0c;我们可以编…

基于微信小程序的在电影线订票小程序+web管理 uniapp,vue,ssm

基于微信小程序的在电影线订票小程序web管理 uniapp&#xff0c;vue&#xff0c;ssm 相关技术 javassmuniapp微信开发者工具hbuildervueelementui前后端分离 -mysql

前端开发工程师——webpack

一.环境准备 npm init -y npm i webpack webpack-cli -D 打包命令 npx webpack ./src/main.js --modedevelopment //development开发模式 //production生产模式 npx webpack 直接运行就行 二.加载器loader 在less/stylus/css/sass/images中添加适当的样式 例如&#xff1…

【时间复杂度空间复杂度】(详)

&#x1f320;个人主页 : 赶路人- - &#x1f30c;个人格言 : 要努力成为梧桐&#xff0c;让喜鹊在这里栖息。 要努力成为大海&#xff0c;让百川在这里聚积。 13.with,prep.用&#xff0c;与&#xff0c;随着 [wɪθ] 14.format,n.格式 [ˈfɔrmt] 1.算法效率 算法效率分析分…

SparkStreaming概述

Spark概述 SparkStreaming概述 Spark Streaming 是 Apache Spark 生态系统中的一个组件&#xff0c;用于实时流数据处理。它允许用户通过流式计算引擎处理实时数据流&#xff0c;并以低延迟的方式对数据进行分析、处理和存储。 背景 在大数据领域&#xff0c;传统的批处理系统…

Go语言实现简单分布式系统(笔记)

视频&#xff1a; Go语言编写简单分布式系统&#xff08;完结&#xff09;_哔哩哔哩_bilibili&#xff0c;作者&#xff1a;杨旭&#xff0c;非常感谢&#xff0c;大佬真牛批 参考笔记及代码&#xff1a; Go语言实现简单分布式系统 - N3ptune - 博客园 (cnblogs.com) 整体框…

Nvidia 如何成为 AI 训练的超级强国

周三&#xff0c;英伟达公布了第一季度的财务业绩&#xff0c;再次超出了分析师的预期。在截至 4 月 28 日的季度中&#xff0c;该公司的利润同比飙升 262%&#xff0c;股价一度创下 1000 美元以上的新高。 目前&#xff0c;英伟达的市值超过 2.3 万亿美元&#xff0c;是全球第…

React自定义Componment和State深层次理解-07

本节主要从底层原理上分析下React开发相关的内容和注意事项&#xff0c;本节会围绕使用展开&#xff0c;而非源码讲解。 Componment详解 什么是组件 在 MVVM架构出现之前&#xff0c;组件主要分为两种。 狭义上的组件&#xff0c;又称为 UI 组件&#xff0c;比如 Tabs 组件、…

shell脚本开发基础

shell脚本开发基础 什么是linux内置命令&#xff1f;什么是外置命令 内置命令&#xff1a;在系统启动时就加载入内存&#xff0c;常驻内存&#xff0c;执行效率更高&#xff0c;但是占用资源&#xff0c;cd 外置命令&#xff1a;系统需要从硬盘中读取程序文件&#xff0c;再读…

C语言对一阶指针 二阶指针的本质理解

代码&#xff1a; #include <stdio.h>char a 2; char* p &a; char** d &p;int main(){printf("a -> %d, &a -> %p\n", a, &a);printf("*p -> %d, p -> %p, &p -> %p\n", *p, p, &p);printf(&qu…

数据库(8)——DML数据操作

增添数据 给指定字段添加数据 INSERT INTO 表名 (字段名1&#xff0c;字段名2,...)VALUES(值1,值2...); 没有的添加的字段默认为NULL。 给全部字段添加数据 INSERT INTO 表名 VALUE (值1,值2,....值n); 此时值的顺序对应表中字段的顺序 批量添加数据 INSERT INTO 表名(字段1,…

【docker】仓库harbor的部署

harbor介绍 Harbor 是一个用于存储和管理 Docker 镜像的开源仓库。它提供了一系列的功能&#xff0c;比如用户管理、访问控制、镜像管理、日志审计和安全扫描等。Harbor 可以作为私有仓库来使用&#xff0c;也可以与公有仓库&#xff08;如 Docker Hub&#xff09;集成使用。 …

云启未来——移动云为未来开发助力

目录 前言 移动云-启未来 原生技术支持 资源和生态 智能化融合创新 移动云-安全可控 移动云如何推动未来行业变革&#xff1f; 移动云产品0元上云系列 文章总结 前言 未来的软件开发形式呈现出更加智能化、自动化和可持续化的趋势。开发工具和流程将更加注重提高开发效…

MySQL从入门到高级 --- 10.索引

文章目录 第十章&#xff1a;10.索引10.1 分类10.2 创建索引10.2.1 单列索引 - 普通索引10.2.2 查看索引10.2.3 删除索引10.2.4 单列索引 - 唯一索引10.2.5 单列索引 - 主键索引10.2.6 组合索引 10.3 全文索引10.3.1 概述10.3.2 使用 10.4 空间索引10.4.1 操作 10.5 原理10.5.1…