C语言⽂件操作讲解(1)

目录

前言

一、为什么使用文件

介绍

二、什么是⽂件

介绍

文件的核心特点:

1.程序⽂件

2.数据⽂件

数据文件的核心作用

数据文件的常见类型

三、⼆进制⽂件和⽂本⽂件

介绍

字符与ASCII码对应表

总存储大小

四、⽂件的打开和关闭

介绍

1.流和标准流

三大标准流及其作用

核心特点

2.⽂件指针

3.⽂件的打开和关闭函数介绍:

(1)fopen函数

(2)fclose函数

返回值

总结


前言

本篇文章将讲解为什么使⽤⽂件、什么是⽂件、⼆进制⽂件和⽂本⽂件、⽂件的打开和关闭、⽂件的顺序读写、⽂件的随机读写、⽂件读取结束的判定、⽂件缓冲区等知识 的相关内容,为本章节知识的内容。

一、为什么使用文件

介绍

我们写的程序数据是存储在电脑的内存中,程序退出后内存会回收数据就丢失了,再次运行无法观察到上一次的数据,而文件是存在硬盘中,即使电脑关机文件也不会丢失,所以我们需要使用文件来将数据进⾏持久化的保存。

二、什么是⽂件

介绍

磁盘(硬盘)上的⽂件是⽂件, 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)。

文件的核心特点:

  • 持久性:数据保存在外部存储中,程序退出后不会丢失。
  • 有序性:数据以字节流形式存储,可按顺序或随机访问。
  • 可操控性:支持创建、读取、写入、修改、删除等操作。

1.程序⽂件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。

例:

2.数据⽂件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。(C语言文件讨论的是数据⽂件)

数据⽂件讲解:

数据文件的核心作用

程序通过数据文件实现数据持久化数据共享

  • 持久化:程序运行时产生的临时数据(如计算结果、用户信息)可写入数据文件,下次运行时直接读取,无需重复生成。
  • 共享性:多个程序可通过读写同一数据文件交换信息(如日志文件、配置文件)。

数据文件的常见类型

根据存储格式,数据文件可分为两类:

| | 分类 | 存储方式 | 特点 | 典型场景 | |-------------|----------------|----------------------|---------------------------| | 文本数据文件 | 以ASCII字符编码存储 | 可读性强(可用记事本打开),占用空间较大 | 日志文件(.log)、配置文件(.ini) | | 二进制数据文件 | 按内存中的二进制格式直接存储 | 占用空间小、读写速度快,不可直接阅读 | 图片(.jpg)、数据库文件(.db) | |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

三、⼆进制⽂件和⽂本⽂件

介绍

根据数据的组织形式,数据⽂件被分为⽂本⽂件和⼆进制⽂件(**二、**中也有介绍)。 数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。

那么⼀个数据在⽂件中是怎么存储的呢?

先给结论:

字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。(如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽ ⼆进制形式输出,则在磁盘上只占4个字节。)

对: 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽ ⼆进制形式输出,则在磁盘上只占4个字节。

图示:

作图有些糙,见谅,若以**⼆进制形式存储,则按内存中的二进制格式直接存储,所以不详细讲解,**

讲一下ASCII码的形式存储:

"10000"以ASCII形式存储时,每个字符对应一个ASCII码值,存储为1字节(8位二进制)。具体如下:

字符与ASCII码对应表

字符 ASCII码值(十进制) 二进制存储形式
'1' 49 00110001
'0' 48 00110000
'0' 48 00110000
'0' 48 00110000
'0' 48 00110000

通过这个表,可知列出图的那些值。

总存储大小

"10000"共5个字符,每个字符占1字节,因此总大小为 5字节(5B)。

四、⽂件的打开和关闭

介绍

1.流和标准流

首先对流讲解:

简单来说:

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

C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。 ⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

标准流:

在C语言中,标准流是程序与外部环境进行输入输出的默认通道,由标准库自动管理,无需手动打开或关闭。

三大标准流及其作用

流名称 文件指针 功能描述 默认设备
标准输入流 stdin 程序读取外部输入的通道 键盘
标准输出流 stdout 程序输出普通信息的通道 显示器(终端窗口)
标准错误流 stderr 程序输出错误信息的通道 显示器(终端窗口)

注意:C语⾔程序在启动的时候,默认打开了这3个流。

核心特点

  1. 自动关联 :程序启动时系统自动创建这三个流,可直接通过 stdin/stdout/stderr 指针操作。
  2. 缓冲机制
    • stdout行缓冲 (遇到换行符 \n 或缓冲区满时输出)。
    • stderr无缓冲(错误信息立即输出,不等待缓冲)。
    • stdin行缓冲(读取到换行符时结束输入)。
  3. 重定向支持 :可通过操作系统命令将流重定向到文件或其他设备(如 ./a.out > output.txtstdout 输出到文件)。
    记:这三个流这是默认打开的,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。 stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为⽂件指针。 C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

2.⽂件指针

缓冲⽂件系统中,关键的概念是"⽂件类型指针",简称"⽂件指针"。 每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

在C语言中,文件指针 是用于操作文件的核心工具,本质是指向 FILE 结构体的指针,通过它可以访问文件的状态信息(如当前位置、缓冲区、读写模式等)。

声明格式:

FILE* p; // ⽂件指针变量
定义p是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变 量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与其关联的⽂件。

3.⽂件的打开和关闭函数介绍:

首先:

1.⽂件在读写之前应该先打开⽂件 ,在使⽤结束之后应该关闭⽂件

2.在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。

3.记:规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

(1)fopen函数

函数形式:

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

介绍:

功能: fopen 函数是⽤来打开参数后续对流的操作是通过 filename 指定的⽂件,同时将打开的⽂件和⼀个流进⾏关联, fopen 函数返回的指针来维护。具体对流(关联的⽂件)的操作是通过参数 mode 来指定的。
参数:

  1. filename :表⽰被打开的⽂件的名字,这个名字可以绝对路径,也可以是相对路径。
  2. mode :表⽰对打开的⽂件的操作⽅式,具体⻅下⾯的表格。

返回值:

  1. 若⽂件成功打开,该函数将返回⼀个指向FILE 对象的指针,该指针可⽤于后续操作中标识对应的流。
  2. 若打开失败,则返回 NULL 指针,所以⼀定要fopen 的返回值做判断,来验证⽂件是否打开成功。

mode参数:

详略来说:

|----|----------------|
| r | 文本文件的只读取 |
| w | 文本文件的只写入 |
| a | 文本文件的追加(用的少) |
| | |
| rb | 二进制文件的只读取 |
| wb | 二进制文件的只写入 |
| ab | 二进制文件的追加 (用的少) |

细说:

  1. r与rb读取的文件,如果不存在,则会报错的。
  2. w与wb写入的文件,如果不存在,则会创建一个该文件名的文件进行写入,但写入的数据会覆盖原来的数据。

代码例子:

cs 复制代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *p=fopen("date.txt","w");

    fclose(p);
}

fclose下面会讲解。

(2)fclose函数

函数形式:

int fclose ( FILE * stream );

介绍:

功能:fclose函数是⽤来关闭参数 stream 关联的⽂件,并取消其关联关系。与该流关联的所有内部缓冲区均会解除关 联并刷新:任何未写⼊的输出缓冲区内容将被写⼊,任何未读取的输⼊缓冲区内容将被丢弃。

参数讲解:

  • stream:指向 FILE 结构体的指针,即需要关闭的文件流(如通过 fopen 打开的文件)。

返回值

  • 成功 :返回 0
  • 失败 :返回 EOF(通常为 -1),并设置 errno 以指示错误原因(如文件写入错误)。

举例子:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *p=fopen("date.txt","w");

   int i= fclose(p);
   printf("%d",i);
}

总结

以上就是今天要讲的内容,本篇文章涉及的C语言⽂件操作讲解的知识点为:为什么使⽤⽂件、什么是⽂件、⼆进制⽂件和⽂本⽂件、⽂件的打开和关闭知识的相关内容,为本章节知识的内容,希望大家能喜欢我的文章,谢谢各位,接下来的内容我会很快更新。

相关推荐
艾莉丝努力练剑3 小时前
【C++STL :string类 (二) 】从接口应用到内存模型的全面探索
linux·开发语言·c++·经验分享
YQ_ZJH3 小时前
Java List列表创建方法大总结
java·开发语言·数据结构·算法·list
什么半岛铁盒3 小时前
C++项目:仿muduo库高并发服务器
linux·服务器·开发语言·c++
Absinthe_苦艾酒3 小时前
golang基础语法(五)切片
开发语言·算法·golang
轩情吖3 小时前
Qt常用控件之QWidget(三)
开发语言·c++·qt·控件·cursor·qwidget·windowopacity
Yilena3 小时前
跟进 JDK25:将虚拟线程安全引入生产的权衡与实战
java·开发语言·虚拟线程·结构化并发·jdk25
_bong3 小时前
python的高阶函数
开发语言·python
MSTcheng.3 小时前
【C++】如何搞定 C++ 内存管理?
开发语言·c++·内存管理
钟离墨笺3 小时前
Go语言-->切片注意点及理解
java·开发语言·golang