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


目录
相关文章
|
11月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
464 0
|
人工智能 C语言
|
存储 小程序 C语言
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
473 5
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
929 3
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
867 23
|
8月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1465 0
|
10月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
450 15
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
613 1
一文彻底搞清楚C语言的函数
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
810 15
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】