文件操作知识点

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

目录

程序文件的分类

文件名

 二进制文件和文本文件

文件的打开和关闭 

流的概念: 

标准流:

文件打开和关闭 

文件的顺序读写函数:

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.mfbz.cn/a/647812.html

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

相关文章

第八篇【传奇开心果系列】Python微项目技术点案例示例:以微项目开发为案例,深度解读Dearpygui 编写图形化界面桌面程序的优势

传奇开心果博文系列 系列博文目录Python微项目技术点案例示例系列 博文目录前言一、开发图形化界面桌面程序的优势介绍二、跨平台特性示例代码和解析三、高性能特性示例代码和解析四、简单易用特性示例代码和解析五、扩展性强示例代码和解析六、现代化设计示例代码和解析七、知…

Android 快速调试网络 复制curl 到postMan

搜索这个插件 官网地址&#xff1a;https://github.com/itkacher/OkHttpProfiler 集成教程也在里面集成完毕后右下角有一个入口点进去可以复制curl| 插件名称&#xff1a;Okhttp Profiler 真的很好用&#xff01;

软测刷题-错题1

提高测试效率的方法&#xff1a; 1、不要做无效的测试 2.不要做重复的测试 3.不同测试版本的测试侧重点 4.优化测试顺序 LoadRunner是对服务器进行施压。 在数据库中存在的用户数是指注册用户数。 input标签可以直接使用send_keys实现上传&#xff0c;而非input标签是无法直…

指纹识别系统架构

目录 1. 系统架构 1.1 指纹采集模块 1.2 指纹处理模块 1.3 指纹登记模块 1.4 指纹识别模块 1.5 指纹识别决策模块 1.6 管理模块 1.6.1 存储管理 1.6.2 传输管理 1.6.3 安全管理 1.7 应用开放功能 1.7.1 指纹登记功能 1.7.2 指纹验证功能 1.7.3 指纹辨识功能 2. …

SparkStreaming架构原理(详解)

Spark概述 SparkStreaming架构原理 Spark Streaming的架构主要由以下几个关键部分组成。 1.数据源接收器&#xff08;Receiver&#xff09; 执行流程开始于数据源接收阶段&#xff0c;其中接收器&#xff08;Receiver&#xff09;负责从外部数据源获取数据流。 接收器可以连…

Android Studio开发之路(十四)自定义Titlebar以及设置顶部状态栏颜色

一、描述 项目需求&#xff0c;我要做一个下图这样的titlebar,包括一个返回按钮&#xff0c;一个关闭按钮&#xff0c;一个文本框。默认的titlebar按钮设计不太满足我的需求&#xff0c;于是我打算自定义一个titlebar组件&#xff0c;应用到我的每一个页面 二、titlebar组件设…

flink程序本地运行:No ExecutorFactory found to execute the application

1.问题描述 在idea中运行flink job程序出现如下错误&#xff1a; Exception in thread "main" java.lang.IllegalStateException: No ExecutorFactory found to execute the application. at org.apache.flink.core.execution.DefaultExecutorServiceLoader.getE…

【蓝桥杯】国赛普及-

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using llunsigned long long; #define int ll const int N2e510; int k0; std::string s; int…

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长&#xff0c;再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析&#xff0c;注释。 &#xff08;1 探讨一&#xff09;当独占指针指向数组时&#xff0c;其默认的删除器是…

HTML橙色爱心

目录 写在前面 准备开始 完整代码 运行结果 系列文章 写在后面 写在前面 本期小编给大家分享一颗热烈且浪漫的爱心&#xff0c;快来看看吧&#xff01; 准备开始 在开始之前&#xff0c;我们需要先简单的了解一下这颗爱心的原理哦~ 本期将用html实现这颗跳动的爱心&a…

0基础认识C语言

为了给0基础一个舒服的学习路径&#xff0c;就有了这个专栏希望带大家一起进步。 话不多说&#xff0c;开始正题。 一、C语言的一段小历史 C语言的设计要追溯到20世纪60年代末和70年代初&#xff0c;在那个时代美国有这么一号人叫做丹尼斯.里奇&#xff0c;他和同事肯.汤普逊…

redis数据操作相关命令

1.list操作 1.1 rpush rpush&#xff1a;新的元素添加到list最右边 #从右边依次往List添加1,2,3 RPUSH name 1 RPUSH name 2 RPUSH name 3#查看列表&#xff1a;返回 1,2,3 LRANGE name 0 -1结果如下&#xff1a; 1.2 lpush lpush&#xff1a;新加的元素在list最左边 #从…

WordPress安装插件失败No working transports found

1. 背景&#xff08;Situation&#xff09; WordPress 社区有非常多的主题和插件&#xff0c;大部分人用 WordPress 都是为了这些免费好用的主题和插件。但是今天安装完 WordPress 后安装插件时出现了错误提示&#xff1a;“ 安装失败&#xff1a;下载失败。 No working trans…

Android 处理音频焦点,解决音乐播放冲突的问题

1. 音频焦点是什么 在Android中&#xff0c;两个或多个 Android 应用可以同时将音频播放到同一输出流&#xff0c;系统会将所有音频混合在一起。 但是多数情况下&#xff0c;这对于用户来说是感到困惑的。为了避免多个应用的多个音频一起播放&#xff0c;Android 引入了“音频…

HTML5 基本框架

HTML5基本的内容 文章目录 系列文章目录前言一、HTML5 基本框架二、具体框架结构三、知识补充总结 前言 HTML5的介绍&#xff1a; HTML5 是一种用于构建网页内容的标准化语言。它是 HTML&#xff08;超文本标记语言&#xff09;的第五个版本&#xff0c;引入了许多新的功能和特…

视频号小店去哪里找货源?最全货源渠道分享!

大家好&#xff0c;我是电商糖果 视频号小店因为是这两年电商行业新出来的黑马&#xff0c;吸引着不少商家入驻。 入驻了商家中很多都没有自己的货源渠道。 他们基本都是从无货源开始起步&#xff0c;后期通过积累资源&#xff0c;慢慢搭建属于自己的货源渠道。 可是渐渐的…

Oracle实践|内置函数之聚合函数

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

SRE视角下的DevOps:构建稳定高效的软件交付流程

SRE 和 DevOps 有什么区别和联系&#xff1f;本文对此进行了解读&#xff0c;并着重从 SRE 实践出发阐述了 DevOps 的建设思路。 SRE 就是在用软件工程的思维和方法论完成以前由系统管理员团队手动完成的工作。SRE 的职责是运维一个服务&#xff0c;该服务由一些相关的系统组件…

解决vue3 vite打包报Root file specified for compilation问题

解决方法&#xff1a; 修改package.json打包命令 把 "build": "vue-tsc --noEmit && vite build" 修改为 "build": "vite build" 就可以了 另外关于allowJs这个问题&#xff0c;在tsconfig.json文件中配置"allowJs&qu…

基于深度学习和opencv的车牌识别系统

免费获取方式↓↓↓ 项目介绍028&#xff1a; 基于深度学习和opencv的车牌识别系统 同时利用对图片每一帧图像加入视频分析模块 图片分析模块可以依据界面按钮提示进行相应功能 视频分析模块可以根据按钮提示进行对视频的分析 &#xff08;视频模块的视频追踪处理时间较长&…