c语言:文件操作(1)

发布时间:2023年12月17日

前言:为什么要使用文件

使用文件可以让程序在不同运行之间保存和读取数据。这样可以实现持久化存储,即使程序关闭后数据也不会丢失。文件也可以用于数据交换,允许不同程序之间共享信息。在 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等结尾。

    文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀。
例如:

假设你有一个名为"mydocument.docx"的文件,它存储在Windows操作系统的C盘的Documents文件夹中。在这种情况下,文件名的各部分如下:

  • 文件路径:C:\Documents\
  • 文件名主干:mydocument
  • 文件后缀:.docx
C:\Documents\mydocument.docx

二进制文件和文本文件

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

二进制文件:数组在内存中以二进制的形式存储,不加转换的输出到外存。

文本文件:以ASCLL字符的形式存储的文件。

17acc0db3ae34e32934b5b1cfe2cf801.webp

示例:

#include<stdio.h>
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.运行完程序后,返回解决方案资源管理器。

找到源文件,添加,现有项

bfa98cd8a5fe4551bea93fa3fb5af4d6.png

2.点开, 找到test文件,双击test文件。

692e3b2433274dc9848e77b9db266107.png

3,回到解决方案中,?此时,已经出现了test.txt文件,右键此文件,找到打开方式,选择二进制编译器,确定

bd4ac9dc84cd490f8be3c1cc1ed0a3d7.png

4.得到结果,观察二进制文件。

efee68c14076460eb548787dd5ef10e1.png?

?流和标准流

在C语言中,流(stream)是一个用于输入和输出的抽象概念。它提供了一种统一的方式来处理不同类型的输入和输出,包括文件、键盘、屏幕和其他设备。

你可以把它想象成水流。就像水流可以从一个地方流向另一个地方一样,流在计算机编程中也是用于数据的流动。

标准流

C语言中有三个标准流:

  1. 标准输入流(stdin):?用于从键盘或其他输入设备读取数据。在C语言中,scanf函数就是从标准输入流中读取数据的一个例子。
  2. 标准输出流(stdout):?用于向屏幕或其他输出设备输出数据。在C语言中,printf函数就是向标准输出流输出数据的一个例子。
  3. 标准错误流(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(文件末尾)。?

读写文件?

一旦文件被打开,就可以使用文件指针进行读取和写入操作。比如,可以使用fscanffprintf函数进行格式化的输入和输出,或者使用freadfwrite函数进行二进制数据的读写操作。?

关闭文件

在文件操作完成后,应该使用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;
}

8053b2c0ffae4bcbbb6ad05f299911e5.png?

下一章节,讲文件的读写顺序,等各种顺序读写函数。

?

文章来源:https://blog.csdn.net/2303_80025768/article/details/134912402
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。