细说文件操作

devtools/2024/10/18 18:30:03/

                       你好!感谢支持孔乙己的新作,本文就文件操作与大家分享我的思路。

                                         希望能大佬们多多纠正及支持 !!!

7edab4be0868428c9c0a750f6d39f83d.jpegcsdnimg.cn/direct/7edab4be0868428c9c0a750f6d39f83d.jpeg" />

                                    个人主页:爱摸鱼的孔乙己-CSDN博客  

目录

 1.什么是文件

 1.1.程序设计文件

1.1.1.程序文件

1.1.2.数据文件 

1.2.二进制文件与文本文件 

2.文件的打开及关闭

 2.1.流和标准流

2.1.1.流(stream)

2.1.2.标准流

2.2.文件指针                                                                                        

2.3.文件的打开及关闭 

2.4.文件的顺序读写

3.文件操作读写深入解析

3.1.fseek

3.2.ftell

3.3.rewind 

3.4.feof 


csdnimg.cn/direct/bec9653db9634e0ab2a624cc2b634f82.jpeg" />csdnimg.cn/direct/960719b24f3948f38c5420e2d12349ab.gif" /> 


 1.什么是文件


Leading ~~ 我们可以把文件看做一种用于存储信息的数据集合,可以是电子形式或纸质形式。在计算机中,文件通常由操作系统管理,保存用户的数据信息,文件可以包含文本、图像、音频、视频等各种数据。因此,我们有必要对文件进行各种处理,常见的文件操作包括创建、打开、读取、写入、关闭和删除等。

 1.1.程序设计文件

从文件功能的角度来分类,我们一般所涉及的有两种文件,一种是程序文件,另一种是数据文件。当然,程序文件一般指的是计算机可执行代码的文件,这些代码通过编译或解释生成,并且程序文件通常用于执行特定的任务或功能。

1.1.1.程序文件

  • 执行性:程序文件可以被操作系统直接执行,在运行时会将代码加载在内存中。
  • 格式 :常见的程序文件格式包括可执行文件(如.exe 、.app等)和脚本文件(如.py 、.js、.sh等)。
  • 内容 程序文件的内容包含了指令和逻辑,用于控制计算机的行为。
  • 开发工具 :程序文件通常是由编程语言的编译器或解释器实现的。

1.1.2.数据文件 

  • 不可执行性:数据文件本身不可以直接执行。
  • 格式多样性:数据文件可以是文本文件(如 .txt、.csv)、二进制文件(如 .bin、.dat)、数据库文件(如 .db、.sqlite)等。
  • 内容:数据文件的内容通常包括文本、数字、图像、音频、视频等多种类型的信息。
  • 结构化和非结构化:数据文件可以是结构化的(如数据库)或非结构化的(如普通文本文件)。

       程序文件主要用于开发和应用程序、工具和系统软件、或用于控制硬件设备和进行系统管理以及自动化任务和处理数据;数据文件主要用于存储用户信息、设置、文档和媒体文件、或用于应用程序的数据输入及输出,乃至进行数据分析、报表生成和数据迁移。 


1.2.二进制文件与文本文件 

        数据在内存中以二进制的形式存储,不加转换的输出到外存的文件中,就是二进制文件,如果外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符的形式存储的文件就是文本文件。字符一律以ASCII形式存储,数值型数据可以用ASCII形式存储,或使用二进制形式存储。csdnimg.cn/direct/382a20f44a5e41f7b6f04837b1cefb39.png" width="309" />csdnimg.cn/direct/4b3aab69ac004927a69b7075d5c5f541.png" width="325" />


2.文件的打开及关闭


 2.1.流和标准流

2.1.1.流(stream)

        流是一种数据传输的一种抽象,通常用于处理数据的输入和输出。流可以看作是数据的序列,可以是字节流(binary stream)或字符流(character stream)。根据数据的方向,流可以分为两种类型,一种是输入流:用于从外部源(如文件、网络、用户输入等)读取数据;另一种是输出流:用于将数据携入外部目标(如显示器、文件、网络连接等)。

流的主要特点包括:

  • 顺序访问:数据以顺序的方式被读取或写入。
  • 可打开和关闭:流在使用前需要被打开,使用后需要关闭,以释放资源。
  • 缓冲:许多实现使用缓冲技术来提高性能,允许数据的块读取和写入。 

2.1.2.标准流

        标准流是操作系统层面定义的一种特殊流,通常是用于数据输和输出的通道。程序运行时,操作系统会提供以下三个流:

标准流
stdin(标准输⼊流在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout( 标准输出流⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出中。
stderr(标准错误流⼤多数环境中输出到显⽰器界⾯。                                                        

2.2.文件指针                                                                                        

        以上stdin、stdouot、stderr三个流的类型是FILE*,通常称为文件指针, 在C语言中,我们就是通过FILE*的文件指针进而维护流的各项操作。

        每个文件在内存中开辟一个对应的文件信息区,用于存放文件的名字、文件状态及文件当前所在的位置。这些信息是保存在一个结构体变量中的,且该结构体类型命名为FILE。然后,我们定义一个指向FILE类型的指针变量ptr,指向某个文件的文件信息区(结构体变量),通过文件指针变量就能够间接查找与之关联的文件。        

csdnimg.cn/direct/20b3c635cd90424caab047f7a94eddfa.png" width="780" />

2.3.文件的打开及关闭 

        当我们编写程序时,在打开文件的同时,都会返回一个的FILE*的指针变量指向该文件,从而建立指针与文件的关系。并且,ANSIC规定使用fopen函数作为打开文件fclose作为关闭文件

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

        其中,mode是文件的打开模式。其中“r“与”w”分别为输入与输出数据,而“a”是向文本文件尾添加数据,当然,诸如“rb“和”wb“,其作用的便是二进制文件,等等。                                                                  

2.4.文件的顺序读写

 fread与fwrite比较适用于文件输入输出流,其余可以适用于所有输入流。               

  csdnimg.cn/direct/13142d6106f1407f9b04a5d5f8f22c0e.png" width="487" />                                     

                                                                                    


3.文件操作读写深入解析


3.1.fseek

        fseek是C语言是一个标准库函数,用于在文件中进行随机访问,并且可以将文件指针定位至特定位置,以便进行读写操作。

//fseek
//根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。
1 int fseek ( FILE * stream, long int offset, int origin );
stream: 指向要操作的文件的指针,通常是通过 fopen 打开的文件。
offset: 偏移量,表示相对于 whence 的字节数。
origin: 确定偏移的起始位置,可以是以下常量之一:
SEEK_SET: 文件开头。
SEEK_CUR: 当前文件指针的位置。
SEEK_END: 文件的末尾。/* fseek example */
#include <stdio.h>int main ()
{FILE * pFile;pFile = fopen ( "example.txt" , "wb" );fputs ( "This is an apple." , pFile );fseek ( pFile , 9 , SEEK_SET );fputs ( " sam" , pFile );fclose ( pFile );return 0;
}

         在使用fseek之前,确保文件已成功打开;如果目标位置超出了文件的实际大小,fseek可能会导致未定义的行为;在进行写入操作之前,确保文件模式允许写入(例如,使用”r+“或”w+“模式)。

3.2.ftell

        ftell是C语言中的一个·标准库函数,用于获取当前文件在文件中的位置,并且它返回的是当前指针相对于文件开头的字节偏移量

返回⽂件指针相对于起始位置的偏移量
1 long int ftell ( FILE * stream );/* ftell example : getting size of a file */#include <stdio.h>
int main ()
{FILE * pFile;long size;pFile = fopen ("myfile.txt","rb");if (pFile==NULL) perror ("Error opening file");else{fseek (pFile, 0, SEEK_END); // non-portablesize=ftell (pFile);fclose (pFile);printf ("Size of myfile.txt: %ld bytes.\n",size);}return 0;
}

        成功时返回当前文件指针的偏移量(类型为 long),在一些特定情况下,如果文件被错误地打开,或者文件指针经过某些非法操作,ftell 可能返回 -1

3.3.rewind 

         rewind是C语言中的一个标准库函数,用于将文件指针重置为文件的开头,使用起来非常简单且直观,通常用于将文件指针返回到起始位置,以便重新开始读取或写入文件内容。

让⽂件指针的位置回到⽂件的起始1 void rewind ( FILE * stream );/* 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';printf(buffer);return 0;
}

   rewind 是一个简单且有效的方法来返回文件指针至开头。调用 rewind 也会清除与文件流关联的错误指示符,因此如果之前的读写操作发生了错误,错误状态会被重置。在使用 rewind 前,确保文件已成功打开,否则将导致未定义行为。

3.4.feof 

feof 的作⽤是:当文件读取结束的时候,判断是读取结束的原因是否是: 遇到文件尾结束 。(不能通过函数的返回值直接判断文件是否结束
文本文件读取是否结束,判断返回值是否为 EOF fgetc ),或者 NULL fgets
        • fgetc 判断是否为 EOF .     
        • fgets 判断返回值是否为 NULL .csdnimg.cn/direct/506d672ca2074a748e817a3740f12f80.gif" />

http://www.ppmy.cn/devtools/90759.html

相关文章

一、安装go环境以及编译输出HelloWorld

目前的热门技术方向从分布式微服务开始转向云原生而云原生方向需要掌握GO语言&#xff0c;基于此决定利用平时的时间来完成GO语言的学习。 安装&#xff08;基于mac m1&#xff09; &#xff08;翻看了网上很多的资料&#xff0c;发现很多人记录的有很多问题&#xff0c;一个…

图论-最小生成树

Prim算法 算法描述 dist[i]<-- for(i 0;i<n;i) t<--找到集合外最近的点 用t更新其他点到集合的距离&#xff08;这个集合就是已经确定的最小生成树的点和边&#xff09; st[t] true; dist[i] <-- 无穷 这一步是初始化所有节点到集合的最小距离为无穷大。dist[i] 表…

Harbor 仓库一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Python 如何进行Web抓取(BeautifulSoup, Scrapy)

Web抓取&#xff08;Web Scraping&#xff09;是一种从网站提取数据的技术。Python有许多用于Web抓取的库&#xff0c;其中最常用的是BeautifulSoup和Scrapy。 BeautifulSoup BeautifulSoup是一个用于解析HTML和XML文档的Python库&#xff0c;适合处理简单的Web抓取任务。它将…

git常见问题(不定期更新)

1、文件名大小写问题 **问题描述&#xff1a;**默认情况下&#xff0c;在windows系统中&#xff0c;git不区分文件名大小写&#xff08;linux系统会区分&#xff09;&#xff0c;所以如果开发环境是windows系统的话&#xff0c;当我们修改文件名大小写时&#xff0c;git无法识…

Spring5 的日志学习

我们在使用 Spring5 的过程中会出现这样的现像&#xff0c;就是 Spring5 内部代码打印的日志和我们自己的业务代码打印日志使用的不是统一日志实现&#xff0c;尤其是在项目启动的时候&#xff0c;Spring5 的内部日志使用的是 log4j2&#xff0c;但是业务代码打印使用的可能是 …

k8s—Prometheus原理

一、Prometheus 1.Prometheus介绍 Prometheus 是一个开源的系统监控和报警系统&#xff0c;现在已经加入到 CNCF 基金会&#xff0c;成为继k8s 之后第二个在 CNCF 托管的项目&#xff0c;在 kubernetes 容器管理系统中&#xff0c;通常会搭配prometheus 进行监控&#xff0c;同…

C# Null 合并运算符 ??

int&#xff1f; 在 C# 中&#xff0c;int? 是一个可空的 int 类型&#xff0c;它能够存储一个 32 位带符号整数或者 null 值。当你声明一个 int? 类型的变量并将其初始化为 null&#xff0c;你实际上是在创建一个可以容纳整数值的变量&#xff0c;但是初始时并没有赋予它任…