使用文件可以让程序在不同运行之间保存和读取数据。这样可以实现持久化存储,即使程序关闭后数据也不会丢失。文件也可以用于数据交换,允许不同程序之间共享信息。在 C 语言中,文件还可以用于读取配置信息,日志记录等。当你玩电脑游戏时,游戏通常会让你保存进度。这就好比把游戏状态保存到一个文件中,这样你可以在之后重新加载游戏而不会丢失进度。另外,想象一下你在做一份报告,你可以把报告内容保存到文件中,这样即使你关掉电脑,文件中的内容也会被保存下来,以便你之后再次打开并继续编辑。文件就像是一个存储盒,可以把数据放进去,然后在需要的时候再取出来使用。总的来说,文件在编程中是非常重要的,可以帮助程序处理数据和信息。
文件是计算机存储数据的一种方式,可以存储文本、图像、音频、视频等各种类型的信息。在计算机中,文件通常被组织成一个由字节组成的序列,每个文件都有一个唯一的名称用于标识。文件可以存储在计算机的硬盘、固态硬盘、光盘、U盘等存储介质上。
从文件功能的角度分为两类:程序文件,数据文件。
程序文件是计算机中用来存储软件程序代码的文件。程序文件可以包含各种编程语言编写的指令和数据,用于告诉计算机如何执行特定的任务或操作。
程序文件通常也具有特定的文件扩展名或后缀,以便操作系统和用户能够识别它们并正确地处理。这些后缀通常指示了程序文件的类型或格式。例如:
数据文件是计算机中用来存储各种类型数据的文件。这些数据可以是文本、图像、音频、视频、数据库记录等。数据文件通常以特定的格式存储,以便计算机能够正确地读取和解释其中的信息。这些文件可以通过各种应用程序进行创建、编辑和访问,以便用户能够查看、修改和管理其中的数据。
数据文件通常具有特定的文件扩展名或后缀,以便操作系统和应用程序能够识别它们并正确地处理。这些后缀通常指示了数据文件的类型或格式。例如:
假设你有一个名为"mydocument.docx"的文件,它存储在Windows操作系统的C盘的Documents文件夹中。在这种情况下,文件名的各部分如下:
C:\Documents\mydocument.docx
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
二进制文件:数组在内存中以二进制的形式存储,不加转换的输出到外存。
文本文件:以ASCLL字符的形式存储的文件。
示例:
#include
int main()
{
// 定义一个整型变量a,赋值为10000
int 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语言中有三个标准流:
scanf
函数就是从标准输入流中读取数据的一个例子。printf
函数就是向标准输出流输出数据的一个例子。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
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;
}
下一章节,讲文件的读写顺序,等各种顺序读写函数。