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


目录
相关文章
|
2月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
2月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
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的扩展。
1606 0
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
36 3
|
4天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
26 6
|
22天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
31 6
|
2月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
43 10