文件操作应用

一.⼆进制⽂件和⽂本⽂件

C语言中的二进制文件与文本文件是两种不同的文件格式,它们的主要区别在于存储的数据形式和处理方式

1. 数据形式:
- 二进制文件:二进制文件以字节序列的形式存储数据,每个字节可以包含任意的二进制数据,包括整数、浮点数、字符等。它们以二进制的方式表示数据,不可直接阅读
- 文本文件:文本文件以字符序列的形式存储数据,每个字符由对应的ASCII码或Unicode码表示。它们以文本的方式表示数据,可直接阅读。

2. 处理方式:
- 二进制文件:由于二进制文件存储的是未经过任何编码的数据,处理二进制文件需要通过特定的算法和文件格式来解析数据。读取和写入二进制文件需要使用特定的二进制I/O函数,如`fread`和`fwrite`(下文将对文件操作命令进行讲解)
- 文本文件:文本文件存储的是以字符形式表示的数据,处理文本文件更加简单直接。读取和写入文本文件可以使用标准的I/O函数,如`fgets`和`fprintf`(下文将对文件操作命令进行讲解)

3. 应用场景:
- 二进制文件:二进制文件通常用于存储和传输那些结构化的数据,如图片、音频、视频等。由于它们可以直接表示底层的二进制数据,所以在处理二进制文件时可以更加灵活。
- 文本文件:文本文件主要用于存储和传输文本数据,如文档、配置文件等。由于文本文件以可读的方式表示数据,所以更适合人类阅读和编辑。

二进制文件和文本文件不严格区分

例如,一个Word文档是以二进制格式存储的(数据在内存中以二进制形式存储),但其中的文本内容可以以文本文件的形式读取和编辑。

二.文件的打开和关闭

在C语言中,文件的打开和关闭是通过使用标准库函数来实现的。主要涉及到的函数有`fopen`、`fclose`和相关的错误处理函数。

1. 文件打开:

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

- `filename`:表示要打开的文件的名称或路径的字符串。
- `mode`:表示打开文件的模式的字符串,可以是以下之一:
  - "r":只读方式打开,文件必须存在
  - "w":写入方式打开,若文件不存在则创建,若文件存在则清空文件内容
  - "a":追加方式打开,若文件不存在则创建,若文件存在则在文件尾部追加内容
  - "rb"、"wb"、"ab":以二进制方式打开文件。
- 返回值:打开成功时返回一个指向文件的指针,打开失败时返回`NULL`

2. 文件关闭:

int fclose(FILE *stream);

- `stream`:要关闭的文件指针。
- 返回值:关闭成功返回0,关闭失败返回非0值。

注意事项:
- 打开的文件必须显式地关闭,以确保释放文件资源。
- 在打开文件失败时,需要处理错误并进行相应的错误处理。

常见的错误处理方式有:
- 检查文件是否成功打开,若打开失败则打印错误信息并执行相应的处理。
- 使用`perror`函数打印具体的错误信息。例如:

FILE *file = fopen("myfile.txt", "r");
if (file == NULL) {
    perror("Failed to open file");
    exit(1); // 终止程序,返回非0值表示出错
}

在使用文件进行读写操作之前,还需要了解其他相关的文件操作函数,如`fread`、`fwrite`、`fgets`、`fprintf`等,它们用于实现具体的读写操作。完成文件操作后,需要使用`fclose`函数关闭文件,释放文件资源。否则,可能会导致文件资源泄漏或无法正确保存文件修改。

三.⽂件的顺序读写

文件的顺序读写操作通过使用标准库函数来实现的。主要涉及到的函数有`fread`、`fwrite`、`fgets`和`fprintf`等。

1. 顺序读取文件内容:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

- `ptr`:指向要读取数据的内存地址。
- `size`:每个数据项的字节数。
- `count`:要读取的数据项的个数。
- `stream`:要读取的文件指针。
- 返回值:返回实际读取的数据项个数。

使用`fread`函数可以顺序读取文件的内容,并将其存储到指定的内存地址中。例如,以下代码读取一个二进制文件的内容:

FILE *file = fopen("myfile.bin", "rb");
if (file != NULL) {
    int data;
    while (fread(&data, sizeof(int), 1, file) == 1) {
        // 处理读取到的数据
    }
    fclose(file);
}

2. 顺序写入文件内容:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

- `ptr`:指向要写入数据的内存地址。
- `size`:每个数据项的字节数。
- `count`:要写入的数据项的个数。
- `stream`:要写入的文件指针。
- 返回值:返回实际写入的数据项个数。

使用`fwrite`函数可以顺序写入数据到文件中。例如,以下代码将一个整型数组的内容写入二进制文件:

int data[] = {1, 2, 3, 4, 5};
FILE *file = fopen("myfile.bin", "wb");
if (file != NULL) {
    fwrite(data, sizeof(int), sizeof(data)/sizeof(int), file);
    fclose(file);
}

3. 顺序读取文本文件内容:

char *fgets(char *str, int size, FILE *stream);

- `str`:指向用于存储读取内容的字符数组的指针。
- `size`:要读取的最大字符数。
- `stream`:要读取的文件指针。
- 返回值:成功读取到内容时返回指向`str`的指针,否则返回`NULL`。

使用`fgets`函数可以顺序按行读取文本文件的内容。例如,以下代码读取一个文本文件的每一行:

char line[100];
FILE *file = fopen("myfile.txt", "r");
if (file != NULL) {
    while (fgets(line, sizeof(line), file) != NULL) {
        // 处理读取到的行
    }
    fclose(file);
}

4. 顺序写入文本文件内容:

int fprintf(FILE *stream, const char *format, ...);

- `stream`:要写入的文件指针。
- `format`:格式化字符串。可以使用与`printf`函数相似的格式化符号。
- 返回值:成功写入的字符数。

使用`fprintf`函数可以顺序按格式化方式将内容写入文本文件。例如,以下代码将一些数据写入文本文件:
 

int value = 123;
char str[20] = "Hello";
FILE *file = fopen("myfile.txt", "w");
if (file != NULL) {
    fprintf(file, "Value: %d\n", value);
    fprintf(file, "String: %s\n", str);
    fclose(file);
}

注意事项:
- 文件操作完成后,必须使用`fclose`函数关闭文件,以释放文件资源
- 在读写文件时,需要对文件操作进行错误检查,并进行相应的错误处理。

四.⽂件的随机读写

1.fseek

根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。

int fseek ( FILE * stream, long int offset, int origin );

2.ftell

返回⽂件指针相对于起始位置的偏移量.

long int ftell ( FILE * stream );

 3.rewind

让⽂件指针的位置回到⽂件的起始位置.

void rewind ( FILE * stream );

补充:文件指针

  文件指针是用来访问文件的位置的指针变量。通过文件指针,可以实现对文件的读取和写入操作。C语言中的文件指针类型是FILE,它是定义在stdio.h头文件中的一个结构体。文件指针变量的声明通常如下所示:

FILE *fp;

其中,fp是一个指向FILE结构体的指针变量,用于表示一个文件。在打开文件之前,文件指针变量的值应该为NULL,表示没有指向任何文件。

文件指针在进行读写操作时可以具有以下几种位置:

  1. 文件开头(BOF):表示指针指向文件的开头位置,可以通过rewind()函数将文件指针设置为文件开头。

  2. 当前位置(Current Position):表示指针指向当前读取或写入的位置,可以通过ftell()函数获取当前位置的偏移量。

  3. 文件结尾(EOF):表示指针指向文件的结尾位置,即后续没有可读取或写入的数据。

 

五.⽂件读取结束的判定

在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束

feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束

六.⽂件缓冲区

在C语言中,文件缓冲区是用来临时存储文件数据的内存区域。它提供了一个缓冲区,可以有效地减少文件读写操作对磁盘的频繁访问,从而提高读写效率。

今日分享到此结束,下次再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值