【C语言进阶】文件操作的相关详解(1):

🎈主页传送门****:良木生香

🔥个人专栏:《C语言》《数据结构-初阶》 《鼠鼠的算法之路》

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离



前言:我们在此之前已经学习了C语言的大部分相关知识,那么我们现在再来学习一下一个崭新的内容:文件。有人就会问了,文件不就是我们在平时使用的文件吗,这有什么好学习的?不着急,我们慢慢来学习


目录

一、为什么使用文件?

二、什么是文件?

2.1、程序文件:

2.2、数据文件:

2.2.1、二进制文件

2.2.2、文本文件

2.3、文件名

三、怎么使用文件?

3.1、流与标准流

3.1.1、流

3.1.2、标准流

3.2、文件指针

3.3、文件的打开与关闭


在进行文件的学习之前,我先将本篇文章的该给内容展现一下:在本篇文章中,我们主要围绕三个方面来讲解:

1、为什么使用文件?

2、文件是什么?

3、怎么使用文件?


一、为什么使用文件?

在这里我先通过一个简单的例子看看我们的程序是怎么样运行的:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 520
#include<stdio.h>
int main() {
	int a = 10;
	printf("%d", a);
	return 0;
}

在这样的程序中,当程序运行起来时,我们可以通过调用的方法看看变量a的地址:

在第一次调用时,变量a的地址如下:

在第二次调用时,变量a的地址如下:

由此可见,在两次的运行当中,变量a的地址是不同的,为什么呢?这是因为数据在程序运行时是保存在内存中的,当程序结束时,内存就会回收程序的这部分空间,这样一来,数据也会被内存回收,当我们想要在程序结束后再找到这个数据,那就找不到了.

为了避免这种情况的的发生,我们就可以通过使用文件的方式,将程序中的数据都保存到文件中,这样我们就可以永久性的保存在硬盘当中.

二、什么是文件?

文件我们一般分为2种:程序文件数据文件

2.1、程序文件:

程序文件包括源程序文件 (像C语言文件.c),目标文件 (windows环境中后缀为.obj),以及可执行文件(.exe).

2.2、数据文件:

文件的内容不一定是程序的运行文件,而是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,亦或是输出内容的文件。在本篇文章中我们主要讨论的是数据文件

在此之前我们对数据的输入输出都是以终端为对象的,即从键盘输入输出,将数据打印到屏幕上,但是有时候我们会将数据输出到磁盘(硬盘)上,需要的时候再将数据从磁盘上读取出来,这样处理的就是磁盘上的文件

2.2.1、二进制文件

二进制文件是数据文件的一种。我们都知道,数据是以二进制的方式在内存中存储的,如果对于存储的结果不加以转换就直接输出到文件中,那我们将这种文件称之为二进制文件

在这段程序中,我们可以看到,内存中的数据是以十六进制存储的,输出后用二进制打开依旧是跟内存中存储的一样,那么现在的"data.txt"就可以说是一个二进制文件

2.2.2、文本文件

文本文件就是我们平时看到的文字文档文件

2.3、文件名

在我们的电脑中,每个文件都有一个独一无二的文件名,文件名的命名规则如下:

文件路径+文件主干+文件后缀

文件后缀就是我们刚才说文件类型的标志,像文本文件的后缀是(.txt)等等.

文件路径又分为相对路径和绝对路径:

**绝对路径:**从根目录开始的完整路线,唯一且不依赖运行位置,但移植性差(换环境就失效),像这样:*(C:\Users\你的用户名\Desktop\persistent_data.txt(桌面))

相对路径: 是以程序当前运行的目录为起点,指向目标文件的简化路径,不需要写完整的根目录,是日常编程中最常用的方式。

在相对路径中,还有一个知识点就是关键符号的使用,关键符号分为两个: " ./ "和" ../ "

./ :这个表示的是将文件在当前运行程序的目录下

../ :这个表示的是文件在当前目录的上一级目录下(如果使用多个 ../ 就表示在上一级的上一级目录下)

三、怎么使用文件?

在讲完是什么和为什么之后,现在我们来讲讲怎么做,在此之前,我们要先做一个知识铺垫:

3.1、流与标准流

3.1.1、流

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

C语言针对文件、画面、键盘的数据输入输出操作都是通过流进行操作的,我们通过下面这张图体会一下流在C语言中的作用:

一般情况下,我们想要向流里面输入数据或者是读取数据,都是要打开流,才进行从操作。

3.1.2、标准流

在我们平时的编程当中,都是需要用到流的,那为什么我们都没有打开过呢?、

那是因为,在我们运行程序时,C语言自动为我们打开了下面这三个流:

1 **.stdin:**标准输入流,大多数情况都是从键盘上输入数据,然后scanf()函数就会从标准输入流中读取数据

2.**stdout:**标准输出流,我们大多数情况就会将数据输出到屏幕上,printf()函数就会将数据输出到标准输出流上

  1. **stderr:**标准错误流,将程序中的出现的错误信息输出到屏幕上

在这里我们要注意的是,上面将的这三种标准流的类型都是FILE*类型的,我们通常将这种类型的指针称之为文件指针

在C语言中,我们就是通过FILE*这些文件指针来维护各种流的操作的

3.2、文件指针

怎么理解文件指针呢?其实很简单,举个例子:

我们去银行取钱,总不能上去直接进金库拿吧?总要让别人验证一下我们的身份吧?那身份证就是我们与金库之间的凭证

那程序与数据也是一样,程序也不能直接到磁盘上或者终端上读取数据,也是要一个两个之间的凭证才能进行操作,而文件指针就是担任着这样的角色。

每个被使用的文件会再系统中先开辟一块区域,叫做文件信息区, 这块区域用来存储文件的信息,而这些信息又是被保存在一个结构体当中,然后这个结构体有别系统统一命名为**:FILE。** 那么指向这个区域的指针,我们就称之为文件指针(FILE*)。

cpp 复制代码
//创建一个文件指针
FILE* point_of_File;

定义point_of_File是指向文件类型的一个指针变量,它可以访问所指向的文件信息区,然后通过这个文件信息区就可以找到这个文件,我们依旧可以通过下面这张图体会两者之间的关系:

3.3、文件的打开与关闭

现在终于进入了本篇文章的重点内容,这么对文件进行基本的操作

我们应该知道,文件在读写之前应该先打开文件 ,想要保存文件应该先关闭文件

标准C语言规定:用fopen 来打开文件,用fclose 来关闭文件,在使用这两个函数之后,会返回一个FILE*变量的指针 来指向该文件信息区域,以便于我们对文件进行操作,这两个函数的原型如下:

fopen()这个函数里面含有两个参数,一个是想要打开文件的名称,另一个打开的方式,是只读呢?还是写入呢?等等

fclose()函数的参数就一个,是指向想要关闭文件的文件指针

对于fopen()参数的const char* mode,这里有几个要注意的类别,下面是一张表格,清晰的就讲解了打开文件的几个类型:

|-------------|-----------------------|-----------|
| 文件使用方式 | 含义 | 如果指定文件不存在 |
| "r" (只读) | 为了向程序输入数据,打开一个已经存在的文件 | 报错 |
| "w" (只写) | 为了给文本输出数据,打开一个已经存在的文件 | 创建一个新文件 |
| "a" (追加) | 向文本末尾追加数据 | 创建一个新文件 |
| "r+" (读和写) | 为了读和写,打开一个文本文件 | 出错 |
| "w+" (读和写) | 为了读和写,打开一个文本文件 | 创建一个新文件 |
| "a+" (读写) | 向文本末尾追加数据 | 创建一个新文件 |
| "rb" (只读) | 为了向程序输入数据,打开一个二进制文件 | 出错 |
| "wb" (只写) | 为了给文本输出数据,打开一个二进制文件 | 创建一个新文件 |
| "ab" (读写) | 向二进制文本末尾追加数据 | 创建一个新文件 |
| "rb+" (读和写) | 为了读和写,打开一个二进制文本文件 | 出错 |
| "wb+" (读和写) | 为了读和写,打开一个文本文件 | 创建一个新文件 |
| "ab+" (读写) | 向文本末尾追加数据 | 创建一个新文件 |
| | | |
[文件使用方式]

下面是实际操作的代码:

cpp 复制代码
#include<stdio.h>
#include<windows.h>
int main(){
    int a = 10;
    //打开文件
    FILE* pf = fopen("data.txt","w");    //如果"data.txt"这个文件不存在,那么会自动创建一个
    printf("打开成功!\n");
    Sleep(1000);
    //关闭文件
    fclose(pf);
    pf = NULL;    //关闭文件之后,要将文件指针指向NULL,让其不变成空指针
    return 0;
}

那么以上就是关于文件操作的简单介绍啦,想要了解更加详细的内容,且听下回分解~~~~~

相关推荐
Larry_Yanan2 小时前
Qt安卓开发(三)双摄像头内嵌布局
android·开发语言·c++·qt·ui
Ka1Yan2 小时前
[链表] - 代码随想录 203. 移除链表元素
数据结构·链表
玖釉-2 小时前
[Vulkan 学习之路] 01 - 迈入高性能图形开发的大门 (Windows 环境搭建)
c++·windows·图形渲染
你怎么知道我是队长2 小时前
C语言---递归
c语言·开发语言
坚持就完事了2 小时前
滑动窗口算法
数据结构
CSDN_RTKLIB2 小时前
【字符编码】字符串处理流程
c++
项目題供诗3 小时前
C语言基础(五)
c语言·开发语言
l1t3 小时前
数独优化求解C库tdoku-lib的使用
c语言·开发语言·python·算法·数独
带土13 小时前
8. C++ explicit 关键字
开发语言·c++