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

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AtCoder ABC周赛2023 11/4 (Sat) E题题解

目录 原题截图&#xff1a; 原题翻译 题目大意&#xff1a; 主要思路&#xff1a; 代码&#xff1a; 原题截图&#xff1a; 原题翻译 题目大意&#xff1a; 给你一个数组&#xff0c;给你一个公式&#xff0c;让你选k个元素&#xff0c;用公式算出最终得分。 主要思路&am…

X86汇编语言:从实模式到保护模式(代码+注释)--c6

X86汇编语言&#xff1a;从实模式到保护模式&#xff08;代码注释&#xff09;–c6 标志寄存器FLAGS&#xff1a; 6th&#xff1a;ZF位&#xff08;Zero Flag&#xff09;&#xff1a;零标志&#xff0c;执行算数或者逻辑运算之后&#xff0c;会将该位置位。10th&#xff1a;D…

安全运营 -- 100个蓝队溯源技巧(逐步更新)

0x00 背景 记录一些常用的入侵排查命令和日常运维思路分享。(排名不分先后,逐步更新ing) 0x01 linux 查询所有用户计划任务 cat /etc/passwd|cut -f 1 -d : |xargs -I {} crontab -l -u {} 0x02 排查linux记录密码后门 strace 监听ssh来源流量记录密码后门(本机输入的密码记…

Shell数组函数:数组——数组和循环(三)

数组统计性别 一、定义性别文件 [root192 ~]# vim sex.txt jack m alice f tom m 二、定义脚本统计性别 [root192 ~]# vim sex.sh #!/bin/bash declare -A sex while read line dotypeecho $line | awk {print $2}let sex[$type] done < sex.txtfor i in ${!sex[]} doecho…

Linux基础——进程初识(一)

1. 硬件 ①冯诺依曼体系 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。其详细结构如下图所示 在这里有几点要说明 1. 这里的储存器实际上指的是内存 2. 输入设备与输出设备都属于外设 常见的输入设备…

实现SQL server数据库完整性

1.创建一个数据库名为“erp” 主数据文件&#xff1a;初始容量为5MB&#xff0c;最大容量为50MB&#xff0c;递增量为1MB&#xff0c;其余参数自设。事务日志文件&#xff1a;初始容量为3MB&#xff0c;最大容量为20MB&#xff0c;递增量为10%&#xff0c;其余参数自设。 创建…

与脾气不太好的领导,相处原则和相处技巧分享

前言 工作上我看到有的人擅长和各种类型领导相处&#xff0c;而有的人则和领导相处不愉快&#xff0c;不懂灵活变通的人 和领导相处出现冲突时则是当面怼领导&#xff0c;不给领导面子&#xff0c;之后被领导打压&#xff0c;甚至有的人和领导相处 不和离开等等&#xff0c;…

多个HTML属性

在HTML中&#xff0c;属性用于提供有关HTML元素的附加信息。在这篇文章中你将学习多个HTML属性&#xff0c;它们可以增强网站的视觉吸引力。 接下来开始吧&#xff01;&#x1f680; Accept 属性 您可以将accept属性与<input>元素&#xff08;仅用于文件类型&#xff…

SPECPOWER2008

一、前言# 1、软件说明# 官网&#xff1a;SERT套件用户指南2.0.5SPECpower介绍SPEC基准及工具SPECpower_ssj2008测试结果SPECpower_ssj2008-Design_ccs - SPEC# SPEC&#xff08;the Standard Performance Evaluation Corporation&#xff09;是一个由计算机硬件厂商、软件公…

jsp页面通过class或者id获取a标签上的属性的值

要通过class和id两种方式获取a标签上的某个属性的值&#xff0c;或者给其赋值&#xff0c;可以使用JavaScript。以下是两种方法的示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

[ 蓝桥杯Web真题 ]-Markdown 文档解析

目录 介绍 准备 目标 规定 思路 补充知识 解法参考 介绍 Markdown 因为其简洁的语法大受欢迎&#xff0c;已经成为大家写博客或文档时必备的技能点&#xff0c;众多博客平台都提倡用户使用 Markdown 语法进行文章书写&#xff0c;然后再发布后&#xff0c;实时的将其转化…

【Element-ui】Icon 图标与Button 按钮

文章目录 前言一、Icon 图标1.1 作用1.2 使用方法1.3 图标集合 二、Button 按钮2.1 基础用法2.2 禁用状态2.3 文字按钮2.4 图标按钮2.5 按钮组2.6 加载中2.7 不同尺寸 总结 前言 在前端开发中&#xff0c;界面的设计和交互是至关重要的一部分。一个直观、易用的界面往往离不开…

AcGeLinearEnt2d::getPerpLine函数

AcGeLinearEnt2d::getPerpLine函数是AutoCAD图形库&#xff08;AutoCAD Geometry Library&#xff0c;即AcGe&#xff09;中的一个成员函数&#xff0c;用于获取一个通过指定点且垂直于当前直线或线性实体的无限长直线。 函数的参数和返回值说明如下&#xff1a; const AcGeP…

js写旋转的时钟动态

目录 1、css代码 2.html代码 3.js代码 1、css代码 .box {position: relative;width: 600px;height: 600px;background: url(./images/clock.jpg) no-repeat center;}.hour,.minute,.second {position: absolute;left: 0;top: 0;width: 100%;height: 100%;}.hour {background…

上个月暴涨34.6%后,SoundHound AI股票现在还能买入吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 揭开SoundHound AI股价波动的原因 S&P Global Market Intelligence的数据显示&#xff0c;在摆脱了10月份的大幅下跌后&#xff0c;SoundHound AI的股价在11月份实现了34.6%的涨幅。 原因是该公司公布了稳健的第三季…

英文论文查重复率网址

大家好&#xff0c;今天来聊聊英文论文查重复率网址&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 英文论文查重复率网址 在撰写英文论文时&#xff0c;查重是确保论文原创性和质量的重要环节快码论文…

国产化, 海量数据库 VastbaseG100 兼容适配

背景&#xff1a; 客户是国内某家电龙头企业&#xff0c;应国产化政策要求&#xff0c; 系统需要适配国产数据库&#xff0c; Vastbase G100 遇到问题&#xff1a; 1. 数据库连接&#xff1a; Vastbase 是基于 postgresql 进行封装&#xff0c; 所以理论上是兼容的&#…

Efficient physics-informed neural networks using hash encoding

论文阅读&#xff1a;Efficient physics-informed neural networks using hash encoding Efficient physics-informed neural networks using hash encoding简介方法PINN哈希编码具有哈希编码的 PINN 实验Burgers 方程Helmholtz 方程N-S 方程训练效率对比 总结 Efficient physi…

容器资源视图隔离 —— 筑梦之路

先做个记录&#xff0c;抽空再整理 K8s 部署 Lxcfs 准入控制器&#xff0c;实现容器中资源单独可见 - 「Johny」PlayGround Kubernetes 中利用 LXCFS 控制容器资源可见性 - 码农教程 容器资源可视化隔离的实现方法_51CTO博客_容器隔离技术 Lxcfs在容器集群中的使用-腾讯云开…

06 JQuery调用接口

文章目录 一、Qs.js库介绍1. Qs简介2. Qs.parse3. Qs.stringify 二、jQuery调用接口1. 增加&#xff08;Create&#xff09;2. 删除&#xff08;Delete&#xff09;3. 读取&#xff08;Read&#xff09;4. 更新&#xff08;Update&#xff09; 三、示例 一、Qs.js库介绍 1. Qs…