C语言文本模式和二进制模式

前言

本篇文章介绍一下C语言的文本模式和二进制模式

文本文件和二进制文件

从宏观上看,无论是文本文件还是二进制文件,文件中保存的都是0和1的序列,因为磁盘只有这两种状态。不同的文件只是对0、1序列的解释不同,如果文件内容是以字符编码的方式保存到文件中的,无论是以哪种编码方式,比如使用ascii编码,unicode编码都可以,这样的文件就是文本文件,也就是文本文件中存在的是一个个字符。如果文件保存的是机器可以识别的数值在内存中的表示,或者是图片、音频等编码的数据,那这种文件就是二进制文件,举个简单的例子,对于数字

复制代码
int i=10000;

如果我们用文本方式保存该值,应该保存'1'、'0'、'0'、'0'、'0'五个字符,但是如果以二进制表示呢,我们只需要保存i的二进制表示
00000000 00000000 00100111 00010000

按照小端法保存依此应该是00010000 00100111 00000000 00000000

C语言的文本模式和二进制模式

C语言之所以要区分文本模式和二进制模式,主要原因就是不同的平台对文本文件的操作不一样,看下面这段代码:

复制代码
#include <stdio.h>
int main(void)
{
    printf("\\r=%hhd,\\n=%hhd\n",'\r','\n');
    FILE* file = fopen("test.d", "w");
    fprintf(file, "A\nB");
    fclose(file);
    file = fopen("test.d", "rb");
    char ch=' ';
    while((ch=getc(file))!=EOF)
    {
        printf("%c,%hhd\n",ch,ch);
    }
    fclose(file);
    return 0;
}

在mac上显示结果如下:

复制代码
\r=13,\n=10
A,65

,10
B,66

在win上显示结果如下:

复制代码
\r=13,\n=10
A,65
,13

,10
B,66

可以发现,在mac上以文本模式存储换行符存储的是\n (据说老版mac存的是\r),在windows系统上存储的是\r\n ,鉴于此,C标准针对文本模式读取写入换行符的时候进行了处理,读取换行符的时候,统一转换成\n,写入换行符的时候,根据不同系统写入不同的数据,比如windows就写入\r\n,把上面的例子读取文件从二进制模式修改为文本模式

复制代码
#include <stdio.h>
int main(void)
{
    printf("\\r=%hhd,\\n=%hhd\n",'\r','\n');
    FILE* file = fopen("test.d", "w");
    fprintf(file, "A\nB");
    fclose(file);
    file = fopen("test.d", "r");
    char ch=' ';
    while((ch=getc(file))!=EOF)
    {
        printf("%c,%hhd\n",ch,ch);
    }
    fclose(file);
    return 0;
}

在windows上执行结果如下:

复制代码
\r=13,\n=10
A,65

,10
B,66

可以发现\r\n转换成了\n

还有一点需要注意,对于文本模式和二进制模式,我们使用ftell获取字节数大小的时候

  • windows系统换行符算两个字节,不管文本模式还是二进制模式,mac系统换行符算一个字节

  • 对于windows系统,文本模式获取的换行符为虽然算两个字符,但是打印出来的都是\n
    看下面的例子:

    #include <stdio.h>
    int main(void)
    {
    printf("\r=%hhd,\n=%hhd\n", '\r', '\n');
    FILE* file = fopen("test.d", "r");
    fseek(file, 0, SEEK_END);
    long size = ftell(file);
    for (int i=1;i<=size;i++)
    {
    fseek(file, -i, SEEK_END);
    printf("%hhd\n",getc(file));
    }
    printf("size:%ld\n", size);
    fclose(file);
    return 0;
    }

在mac系统下,输出的字节大小都是3,

在windows系统下,输出的字节大小是4,文本模式输出如下:

复制代码
\r=13,\n=10
66
10
10
65
size:4

二进制模式输出如下:

复制代码
\r=13,\n=10
66
10
13
65
size:4

总结

我们一般使用二进制模式保存的数据都是我们定义好的数据结构数据,这种数据是不需要换行符这种东西的,基本是为了数据的安全或者更紧凑。我们自己负责数据的修改和解析

如果是为了显示或者便于别人编辑的数据,建议保存成文本文件。

相关推荐
梵得儿SHI1 分钟前
Java 反射机制深度解析:从运行时 “解剖” 类的底层逻辑
java·开发语言·反射·反射机制·private·类成员·反射的三大核心功能
坚持编程的菜鸟12 分钟前
LeetCode每日一题——矩阵置0
c语言·算法·leetcode·矩阵
虚行27 分钟前
Python学习入门
开发语言·python·学习
总有刁民想爱朕ha31 分钟前
Python自动化从入门到实战(23):Python打地鼠游戏开发
开发语言·python·游戏开发
曹牧31 分钟前
C#:函数默认参数
开发语言·c#
黄焖鸡能干四碗41 分钟前
MES生产执行制造系统建设(Java+Mysql)
java·大数据·开发语言·信息可视化·需求分析
workflower43 分钟前
跨链协同制造中的服务博弈与激励机制
开发语言·软件工程·制造·需求分析·个人开发·结对编程
liulilittle1 小时前
Y组合子剖析:C++ 中的递归魔法
开发语言·c++·编程语言·函数式编程·函数式·函数编程·y组合子
金涛03193 小时前
QT-day2,信号和槽
开发语言·qt·命令模式
坚持编程的菜鸟6 小时前
LeetCode每日一题——困于环中的机器人
c语言·算法·leetcode·机器人