推广 热搜: 行业  机械  设备    教师  经纪  系统  参数    蒸汽 

C语言从入门到实战——文件操作

   日期:2024-11-13     移动:http://3jjewl.riyuangf.com/quote/889.html
文件操作

C语言中的文件操作是通过使用文件指针来实现的。可以使用标准库中的函数来打开、读取、写入和关闭文件。

C语言从入门到实战——文件操作

下面是一些常见的文件操作函数:

在进行文件操作时,需要注意以下几点:

这是一个简单的文件操作的示例:

在上面的示例中,程序打开了一个名为 的文件,读取文件中的一个整数,并打印出来。最后关闭了文件。

如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。

磁盘上的文件是文件。

但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

文件的本质是结构体

2.1 程序文件

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

2.2 数据文件

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

在以前文章中所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。

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

2.3 文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:

为了方便起见,文件标识常被称为文件名。

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

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以码的形式存储,则需要在存储前转换。以字符的形式存储的文件就是文本文件。

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

字符一律以形式存储,数值型数据既可以用形式存储,也可以使用二进制形式存储。如有整数,如果以码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2019测试)。

在VS上打开二进制文件:

4.1 流和标准流

4.1.1 流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

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

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

4.1.2 标准流

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

标准输入输出流是默认打开的,可以直接使用

那是因为C语言程序在启动的时候,默认打开了3个流:

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

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

C语言中,就是通过 的文件指针来维护流的各种操作的。

4.2 文件指针

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

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

例如,VS2013编译环境提供的 头文件中有以下的文件类型申明:

不同的C编译器的类型包含的内容不完全相同,但是大同小异。

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

一般都是通过一个的指针来维护这个结构的变量,这样使用起来更加方便。

下面我们可以创建一个的指针变量:

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

比如:

创建文件变量,的数据会拷贝到 这个文件结构体中,将这个文件结构体填满

4.3 文件的打开和关闭

文件操作,操作成功返回文件指针,操作失败会返回

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

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

规定使用 函数来打开文件, 来关闭文件。

表示文件的打开模式,下面都是文件的打开模式:

ps: 除了有关追加的,其余的像w和r的,在使用存入的时候会清空里面的数据,而不会保留,想要保留,要使用追加

4.4 文件的路径

C语言文件的路径指向文件在计算机中的位置。路径可以是绝对路径,也可以是相对路径。

绝对路径是从计算机文件系统的根目录开始的完整路径。例如,Windows系统中的绝对路径可能是,而Unix/Linux系统中的绝对路径可能是。

相对路径是相对于当前工作目录的路径。当前工作目录是执行程序或脚本的位置。例如,当前工作目录是,文件位于当前工作目录下的子目录中,则相对路径可能是。

在C语言中,使用文件操作函数打开、读取和写入文件时,需要提供文件的路径作为参数。使用绝对路径可以确保准确找到文件,而使用相对路径可以简化文件路径的书写。

在VS中,路径需要双斜杠 表示当前路径 表示上一级路径

绝对路径

相对路径

当前路径的上一级路径的上一级路径

5.1 顺序读写函数介绍

所有流 分为标准输入输出流和文件输入输出流

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);

所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

fgetc

见下面

fputc

c语言的函数用于将一个字符写入到文件中。该函数的原型如下:

其中,表示要写入的字符,表示要写入的文件指针。该函数返回写入的字符,如果出现错误,则返回。

下面是一个示例:

上述示例将字符写入到名为的文件中。

fgets

见下面

fputs

C语言的函数用于将字符串写入到文件中。该函数的原型如下:

其中,表示要写入的字符串,表示要写入的文件指针。该函数返回非负值表示成功,返回表示出现错误。

下面是一个示例:

上述示例将字符串写入到名为的文件中。

fscanf

C语言中的 函数用于从文件中读取数据。它的格式与 函数类似,但需要指定要读取的文件。

其中, 是指向要读取的文件的指针, 是要读取的数据的格式字符串, 表示可以接收任意数量和类型的参数,用来接收读取的数据。

下面是一个示例:

上述示例中,我们首先使用 函数打开名为 的文件。然后,使用 函数从文件中读取两个整数,并将它们存储到变量 和 中。最后,使用 函数将读取的两个整数输出到屏幕上。

需要注意的是,在使用 函数读取文件数据之前,我们需要确保文件已经成功打开,并且在使用完毕后需要使用 函数关闭文件。

fprintf

C语言中的 函数用于将指定的数据按照指定的格式写入到文件中。它的格式与 函数类似,但需要指定要写入的文件。

其中, 是指向要写入的文件的指针, 是要写入的数据的格式字符串, 表示可以接收任意数量和类型的参数,用来传递要写入的数据。

下面是一个示例:

上述示例中,我们首先使用 函数打开名为 的文件,并指定以写入方式打开文件。然后,使用 函数将整数 写入文件,同时按照指定的格式进行格式化输出。最后,使用 函数关闭文件。

需要注意的是,在使用 函数写入文件数据之前,我们需要确保文件已经成功打开,并且在使用完毕后需要使用 函数关闭文件。

fread

在 C 语言中, 函数用于从文件中读取指定数量的数据,并将其存储到缓冲区中。它的函数原型如下:

其中, 是一个指向要读取数据的缓冲区的指针, 是每个数据项的大小(以字节为单位), 是要读取的数据项的数量, 是一个指向要读取的文件的指针。

函数会返回实际读取的数据项数量,若返回值小于 ,可能是因为已经到达了文件结尾或发生了读取错误。

下面是一个示例,演示如何使用 从文件中读取数据:

在上述示例中,我们首先使用 函数打开名为 的文件,并指定以只读方式打开文件。然后,使用 函数从文件中读取 5 个整数,将其存储在 数组中。最后,使用循环输出读取到的整数。

需要注意的是,在使用 函数读取文件数据之前,我们需要确保文件已经成功打开,并且在使用完毕后需要使用 函数关闭文件。

fwrite

在 C 语言中, 函数用于将数据从内存写入到文件中。它的函数原型如下:

其中, 是指向要写入的数据的指针, 是每个数据项的大小(以字节为单位), 是要写入的数据项的数量, 是一个指向要写入的文件的指针。

函数会返回实际写入的数据项数量,若返回值小于 ,可能是因为写入错误或者磁盘已满。

下面是一个示例,演示如何使用 将数据写入文件:

在上述示例中,我们首先使用 函数以写入方式打开名为 “data.txt” 的文件。然后,使用 函数将 数组中的 5 个整数写入文件。最后,使用 函数关闭文件。

需要注意的是,在使用 函数写入文件数据之前,我们需要确保文件已经成功打开,并在使用完毕后使用 函数关闭文件。

5.2 对比一组函数

和 ,跟 和 相比 只是前面多了一个文件指针

sscanf

函数是C语言中的一个输入函数,用于从字符串中按照指定的格式解析数据。它的函数原型为:

其中,是要解析的字符串,是解析的格式字符串,…表示可变参数列表,表示要解析的数据的地址。

函数根据中的格式指定符,从中读取数据,并将解析出的数据存放在可变参数列表中的相应位置。它可以解析各种类型的数据,比如整数、浮点数、字符等。

下面是一个使用函数的例子:

输出结果为:

可以看到,函数按照指定的格式从字符串中解析出了整数、浮点数和字符串,并赋值给相应的变量。

sprintf

函数是C语言中的一个输出函数,用于将格式化的数据写入字符串中。它的函数原型为:

其中,是要写入的字符串,是格式化字符串,表示可变参数列表,表示要写入的数据。

函数根据中的格式指定符,将可变参数列表中的数据按照指定格式写入到中。它可以写入各种类型的数据,比如整数、浮点数、字符串等。

下面是一个使用函数的例子:

输出结果为:

可以看到,函数根据指定的格式将整数、浮点数和字符串转换为字符串,并写入到中。最终中包含了格式化后的数据。

必须和 的格式相同,不然会出现读入错误的问题

5.3标准的数据拷贝

在文件中,每读取一个字符,文件中的光标都会向后移动一位

6.1 fseek

根据文件指针的位置和偏移量来定位文件指针。

设置的指针的位置是 起始位置 + 偏移量 ;

其中的 参数就是 起始位置 , 有以下三种选择 : 文件头 0 当前位置 1 文件尾 2 偏移量参数 , 可以为正数 , 也可以为负数 ;

如果执行成功 , 则返回 , 失败返回 , 并设置 错误代码 ; 例子:

6.2 ftell

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

例子:

6.3 rewind

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

例子:

fgetc

在C语言中,函数用于从文件中读取一个字符。它接受一个文件指针作为参数,并返回文件中的下一个字符(以整数形式)。如果到达文件末尾或发生错误,它返回特殊值。以下是一个使用示例:

在这个示例中,程序打开了一个名为的文件,并逐个字符读取其内容,直到达到文件末尾。然后,将每个字符打印到控制台上。最后,关闭文件以释放系统资源。

fgets

在C语言中,函数用于从文件中读取一行文本。它接受三个参数:一个字符数组指针,用于存储读取的字符串;一个整数值,表示要读取的最大字符数(包括空字符);一个文件指针,指定要从中读取的文件。

函数会一直读取字符,直到遇到换行符(包括换行符在内)或达到指定的最大字符数。读取的字符串将存储在指定的字符数组中,并在结束时自动添加一个空字符。

以下是一个使用示例:

在这个示例中,程序打开了一个名为的文件,并逐行读取其内容。读取的每一行被存储在名为的字符数组中,并随后被打印到控制台上。最后,关闭文件以释放系统资源。

7.1 被错误使用的 feof

牢记:在文件读取过程中,不能用函数的返回值直接来判断文件的是否结束。

的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。

例如:

文本文件的例子:

二进制文件的例子:

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

刷新缓存区 写入的数据放入缓冲区,放满了才能写,或者刷新缓冲区也能写

这里可以得出一个结论:

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

本文地址:http://oml01z.riyuangf.com/quote/889.html    迅易网 http://oml01z.riyuangf.com/ , 查看更多

特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关行业动态
推荐行业动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号