C语言进阶⑲(文件下篇)(文件读写+文本文件和二进制文件+EOF+文件缓冲区)(上)

简介: C语言进阶⑲(文件下篇)(文件读写+文本文件和二进制文件+EOF+文件缓冲区)

image.gif

4.9对比一组函数:

scanf / fscanf / sscanfprintf / fprintf / sprintf


5. 文件的随机读写

5.1 fseek文件指针定位函数

介绍:根据文件指针的位置和偏移量来定位指针。

参数:offset 是偏移量。

参数:origin 是起始位置,有三种选项:

① SEEK_CUR 当前文件指针的位置开始偏移。

② SEEK_END 文件的末尾位置开始偏移。

③ SEEK_SET 文件的起始位置开始偏移。

代码演示:手动创建一个文件,打开文件随便写点内容


 
#include <stdio.h>
int main() 
{
    FILE* pf = fopen("test6.txt", "r");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    // 读取文件
    int ch = fgetc(pf);
    printf("%c\n", ch);//a
    ch = fgetc(pf);
    printf("%c\n", ch);//b
    ch = fgetc(pf);
    printf("%c\n", ch);//c
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

如果我想得到 a a b,该怎么做?可以试着使用 fseek 函数:

 
 #include <stdio.h>
int main() 
{
    FILE* pf = fopen("test6.txt", "r");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    // 读取文件
    int ch = fgetc(pf);
    printf("%c\n", ch);//a
    // 调整文件指针
    fseek(pf, -1, SEEK_CUR); // SEEK_CUR为当前文件指针位置,偏移量为-1,向前移动1个单位
    ch = fgetc(pf);
    printf("%c\n", ch);//a
    ch = fgetc(pf);
    printf("%c\n", ch);//b
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

SEEK_SET ,打印 a d e

 
#include <stdio.h>
int main() 
{
    FILE* pf = fopen("test6.txt", "r");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    // 读取文件
    int ch = fgetc(pf);
    printf("%c\n", ch);//a
    // 调整文件指针
    fseek(pf, 3, SEEK_SET); // SEEK_SET为文件的起始位置,偏移量为3,向后移动3个单位
    ch = fgetc(pf);
    printf("%c\n", ch);//d
    ch = fgetc(pf);
    printf("%c\n", ch);//e
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

SEEK_END ,打印 a e f

 
#include <stdio.h>
int main()
{
    FILE* pf = fopen("test6.txt", "r");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    // 读取文件
    int ch = fgetc(pf);
    printf("%c\n", ch);//a
    // 调整文件指针
    fseek(pf, -2, SEEK_END); // SEEK_END为当前文件末尾位置,偏移量为-2,向前移动2个单位
    ch = fgetc(pf);          //如果写test6.txt时加了回车就会出错
    printf("%c\n", ch);//e
    ch = fgetc(pf);
    printf("%c\n", ch);//f
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

5.2 ftell返回偏移量函数

在上边创建好test.txt后,代码演示:ftell 的使用方法

 
#include <stdio.h>
int main() 
{
    FILE* pf = fopen("test6.txt", "r");
    if (pf == NULL) 
    {
        perror("fopen");
        return 1;
    }
    // 调整文件指针
    fseek(pf, 5, SEEK_CUR); // SEEK_CUR为当前文件指针位置,偏移量为5,向后移动5个单位
    // 读取文件
    int ch = fgetc(pf);
    printf("%c\n", ch); // f
    // 返回偏移量
    int ret = ftell(pf);
    printf("%d\n", ret); // 6
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}


5.3 rewind 文件指针回到起始位置函数

介绍:rewind(意为倒带(我受够了等待~你所谓的安排~),磁带倒带),

设置文件位置为给定流 stream 的文件的开头,

让文件指针回到起始位置。

代码演示:利用 rewind 函数让文件指针回到起始位置

 
#include <stdio.h>
int main() 
{
    FILE* pf = fopen("test6.txt", "r");
    if (pf == NULL) 
    {
        perror("fopen");
        return 1;
    }
    // 调整文件指针
    fseek(pf, 5, SEEK_CUR); // SEEK_CUR为当前文件指针位置,偏移量为5,向后移动5个单位
    // 读取文件
    int ch = fgetc(pf);
    printf("%c\n", ch); // f
    // 返回偏移量
    int ret = ftell(pf);
    printf("%d\n", ret); // 6
    // 让文件指针回到起始位置
    rewind(pf);
    ch = fgetc(pf);  //再读取一次
    printf("%c\n", ch);//a
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

6. 文本文件和二进制文件

再上一节中,我们已经对文本文件二进制文件开了个头,在这里将进行详细探讨。

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

6.1 文本文件

什么是文本文件?

如果要求在外存上以 ASCII 码的形式存储,则需要在存储之前进行转换。

以 ASCII 字符的形式存储的文件,就是文本文件。

6.2 二进制文件

什么是二进制文件?

数据在内存中以二进制的形式存储,如果不加以转换地输出到外存,就是二进制文件。

6.3 数据在文件中的存储方式

一个数据在文件中是如何存储的呢?

存储方式如下:

① 字符一律以 ASCII 形式存储。

② 数值型数据既可以用 ASCII 形式存储,也可以使用二进制形式存储。

举个简单的例子:比如整数10000,如果以 ASCII 码的形式形式输出到磁盘,

则磁盘中占用5个字节(每个字符占1个字节)。而如果以二进制的形式输出,

则在磁盘上只占4个字节。

测试代码:

 
#include <stdio.h>
int main() 
{
    int a = 10000;
    FILE* pf = fopen("test6.txt", "wb");
    if (pf == NULL) 
    {
        perror("fopen");
        return 1;
    }
    // 写文件
    fwrite(&a, sizeof(int), 1, pf); // 二进制的形式写到文件中
    // 关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

(代码成功运行后打卡文件就发现是乱码)

使用强大的VS来打开我们的二进制文件 test6.txt

详细步骤如下:

点击源文件添加现有项,选中刚才的二进制文件(test6.txt)

添加到VS后选择打开方式,向下拉,选择二进制编辑器打开:


最后,我们来检测一下 10000 是不是 10 27 00 00

10000的二进制:0000 0000 0000 0000 0010 0111 0001 0000

转化为十六进制(八位转两位):00 00 27 10

小端倒过来就是10 27 00 00

总结:文本文件和二进制文件的存储方式

① 文本文件:将内存里的数据转换成 ASCII 码值的形式存储到文件中。

② 二进制文件:将内存里的二进制数据不加任何转化直接存储到二进制文件中。


C语言进阶⑲(文件下篇)(文件读写+文本文件和二进制文件+EOF+文件缓冲区)(下):https://developer.aliyun.com/article/1513250


目录
相关文章
|
23天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
74 3
|
2月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
2月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
2月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
C语言 C++ 编译器
C语言清空输入缓冲区
来源:http://blog.csdn.net/guanyasu/article/details/53153705 https://zhidao.baidu.com/question/5241738.html   C语言中如何清空输入输出缓冲区  上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数,只是部分编译器自己实现的函数,是对标准C的扩展。
1608 0
|
20天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
39 10
|
20天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
42 9
|
20天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
31 8
|
20天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
41 6