前言:为什么要使用文件
使用文件可以让程序在不同运行之间保存和读取数据。这样可以实现持久化存储,即使程序关闭后数据也不会丢失。文件也可以用于数据交换,允许不同程序之间共享信息。在 C 语言中,文件还可以用于读取配置信息,日志记录等。当你玩电脑游戏时,游戏通常会让你保存进度。这就好比把游戏状态保存到一个文件中,这样你可以在之后重新加载游戏而不会丢失进度。另外,想象一下你在做一份报告,你可以把报告内容保存到文件中,这样即使你关掉电脑,文件中的内容也会被保存下来,以便你之后再次打开并继续编辑。文件就像是一个存储盒,可以把数据放进去,然后在需要的时候再取出来使用。总的来说,文件在编程中是非常重要的,可以帮助程序处理数据和信息。
文件的定义
文件是计算机存储数据的一种方式,可以存储文本、图像、音频、视频等各种类型的信息。在计算机中,文件通常被组织成一个由字节组成的序列,每个文件都有一个唯一的名称用于标识。文件可以存储在计算机的硬盘、固态硬盘、光盘、U盘等存储介质上。
分类:
从文件功能的角度分为两类:程序文件,数据文件。
程序文件:
程序文件是计算机中用来存储软件程序代码的文件。程序文件可以包含各种编程语言编写的指令和数据,用于告诉计算机如何执行特定的任务或操作。
程序文件通常也具有特定的文件扩展名或后缀,以便操作系统和用户能够识别它们并正确地处理。这些后缀通常指示了程序文件的类型或格式。例如:
- 可执行程序文件通常以.exe、.app、.bat等结尾。
- 脚本文件通常以.sh、.py、.js等结尾。
- 动态链接库文件通常以.dll、.so等结尾。
- Java程序文件通常以.jar、.class等结尾。
- HTML网页文件通常以.html、.htm结尾。
数据文件:
数据文件是计算机中用来存储各种类型数据的文件。这些数据可以是文本、图像、音频、视频、数据库记录等。数据文件通常以特定的格式存储,以便计算机能够正确地读取和解释其中的信息。这些文件可以通过各种应用程序进行创建、编辑和访问,以便用户能够查看、修改和管理其中的数据。
数据文件通常具有特定的文件扩展名或后缀,以便操作系统和应用程序能够识别它们并正确地处理。这些后缀通常指示了数据文件的类型或格式。例如:
- 文本文件通常以.txt、.doc、.pdf等结尾。
- 图像文件通常以.jpg、.png、.gif等结尾。
- 音频文件通常以.mp3、.wav、.flac等结尾。
- 视频文件通常以.mp4、.avi、.mov等结尾。
- 数据库文件通常以.db、.mdb、.sql等结尾。
文件名
假设你有一个名为"mydocument.docx"的文件,它存储在Windows操作系统的C盘的Documents文件夹中。在这种情况下,文件名的各部分如下:
- 文件路径:C:\Documents\
- 文件名主干:mydocument
- 文件后缀:.docx
C:\Documents\mydocument.docx
二进制文件和文本文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
二进制文件:数组在内存中以二进制的形式存储,不加转换的输出到外存。
文本文件:以ASCLL字符的形式存储的文件。
示例:
#include<stdio.h>
int main()
{// 定义一个整型变量a,赋值为10000int a = 10000;// 打开一个名为test.txt的文件,以二进制写入模式打开FILE* pf = fopen("test.txt", "wb");// 将变量a的内容以二进制形式写入到文件中fwrite(&a, 4, 1, pf);// 关闭文件fclose(pf);// 将文件指针置为空pf = NULL;// 返回0,表示程序正常结束return 0;
}
这段代码的功能是将整数变量a的值10000以二进制形式写入到名为test.txt的文件中。具体来说,它通过fopen
函数以二进制写入模式打开文件,然后使用fwrite
函数将整数a的二进制表示写入到文件中,最后使用fclose
关闭文件。
效果演示:
1.运行完程序后,返回解决方案资源管理器。
找到源文件,添加,现有项
2.点开, 找到test文件,双击test文件。
3,回到解决方案中, 此时,已经出现了test.txt文件,右键此文件,找到打开方式,选择二进制编译器,确定
4.得到结果,观察二进制文件。
流和标准流
在C语言中,流(stream)是一个用于输入和输出的抽象概念。它提供了一种统一的方式来处理不同类型的输入和输出,包括文件、键盘、屏幕和其他设备。
你可以把它想象成水流。就像水流可以从一个地方流向另一个地方一样,流在计算机编程中也是用于数据的流动。
标准流
C语言中有三个标准流:
- 标准输入流(stdin): 用于从键盘或其他输入设备读取数据。在C语言中,
scanf
函数就是从标准输入流中读取数据的一个例子。 - 标准输出流(stdout): 用于向屏幕或其他输出设备输出数据。在C语言中,
printf
函数就是向标准输出流输出数据的一个例子。 - 标准错误流(stderr): 用于向屏幕或其他输出设备输出错误信息。在C语言中,
fprintf
函数可以向标准错误流输出数据。
stdin、stdout、stderr三个流的类型是:FILE*,通常称为文件指针。
C语言中,就是通过FILE*的文件指针来维护流的各种操作的。
文件指针
文件指针是C语言中用于处理文件的重要概念。它是一个指向FILE类型的指针,FILE类型是C语言标准库中用于表示文件的结构体类型。
例如:VS2022编译器环境下提供的stdio.h头文件中,有以下的文件类型声明:
typedef struct
{int _Placeholder;
} fpos_t;typedef struct
{unsigned int _Mode;
} _fmode_t;typedef struct
{long long _Placeholder;
} fpos64_t;typedef struct _iobuf
{char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;
} FILE;typedef struct _wfinddata_t
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;_fsize_t size;wchar_t name[260];
} _wfinddata_t;typedef struct _wfinddatai64_t
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;__int64 size;wchar_t name[260];
} _wfinddatai64_t;typedef struct _wfinddata32_t
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;unsigned long size;wchar_t name[260];
} _wfinddata32_t;typedef struct _wfinddata32i64_t
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;unsigned __int64 size;wchar_t name[260];
} _wfinddata32i64_t;
文件的关闭和打开:
打开文件
要使用文件指针,首先需要打开文件。可以使用fopen
函数来打开文件,该函数会返回一个指向FILE类型的指针,表示打开的文件。fopen
函数的原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename
是要打开的文件名,mode
表示文件的打开模式,比如读取、写入、追加等。
文件指针的位置
文件指针指示了文件中当前的位置,它可以在文件中移动,以便进行读取或写入操作。可以使用fseek
函数来移动文件指针的位置:
int fseek(FILE *stream, long offset, int origin);
其中,stream
是文件指针,offset
是偏移量,origin
表示起始位置,可以是SEEK_SET
(文件开头)、SEEK_CUR
(当前位置)或SEEK_END
(文件末尾)。
读写文件
一旦文件被打开,就可以使用文件指针进行读取和写入操作。比如,可以使用fscanf
和fprintf
函数进行格式化的输入和输出,或者使用fread
和fwrite
函数进行二进制数据的读写操作。
关闭文件
在文件操作完成后,应该使用fclose
函数关闭文件,释放文件资源:
int fclose(FILE *stream);
示例
下面是一个示例,演示了如何使用文件指针来打开文件、写入数据并关闭文件:
#include <stdio.h>int main()
{FILE *fp;fp = fopen("example.txt", "w"); // 以写入模式打开文件if (fp != NULL) {fprintf(fp, "This is a file created using file pointers!"); // 写入数据fclose(fp); // 关闭文件}return 0;
}
下一章节,讲文件的读写顺序,等各种顺序读写函数。