关于read,write,open时出现的文本文件和二进制文件读写的问题(怎么写入怎么读)

1、发现问题


使用read读取文本文件,一般采用字符空间作为缓存,最后输出;

        


使用read读取二进制文件,这里采用整数读取的展示:

首先创建文本文件,用write写入i的值到文件中;

再通过lseek改变读写一个文件时的读写指针位置,用SEEK_SET把指针设置回起始位置;

然后再次把读取到的数据写入整型变量a的地址,直接%d输出。


问题1:为什么文本文件要用字符数组,而二进制文件要用变量名的地址呢。

问题2:在打开文件对象时,文件是什么格式传输的。

问题3:可以通用转化read吗,这样会不会有些麻烦?


2、解决问题:

通过改变文本文件的内容发现规律:

首先把文本文件内容设置成1234;

通过字符数组read并打印时,屏幕输出结果正常为1234;

通过整型变量的方式来输出时:输出了一串数字;

刚开始认为时整型变量的首地址,但是经过增加或删除文本文档的1234,发现数据也会变,故认定不是首地址;

询问老师后老师让我采用16进制输出看一下:

于是出现了34333531,每两位十六进制代表一字节当我把他们分开发现:

34  33   32  31   (这不就是1234的ASCII码的逆序吗,恍然大悟)  

于是又产生问题:为什么输出出来是4321;

查资料后得知,

关键点在于计算机内部的数据存储方式,即所谓的字节序(Endian)**问题。


  1. 小端序存储(Little Endian)

    • 在小端序存储中,低位字节(即最小的有效字节)存储在内存的低地址处,而高位字节则存储在高地址处。
    • 例如,对于整数值 0x1234,在小端序存储中,内存中的存储方式是 34 12(最低有效字节 34 存储在低地址处,高有效字节 12 存储在高地址处)。
  2. ASCII 码的影响

    • 当你的程序读取文本文件中的字符时,它实际上读取的是每个字符的 ASCII 码值。例如,字符 '1' 的 ASCII 码是 49,字符 '2' 的 ASCII 码是 50,以此类推。
  3. 输出的十六进制值 34333231 解释

    • 对于字符串 "1234.",它的 ASCII 码值依次是 49 ('1'), 50 ('2'), 51 ('3'), 52 ('4'), 46 ('.').
    • 这些 ASCII 码值在内存中按照小端序排列: 31 32 33 34 2E(以十六进制表示)。
    • 当程序以整数的方式读取并输出这些字节时,它会按照内存中的存储顺序解释这些字节,因此得到的结果是 34333231。这是因为在小端序存储中,低位字节 31 存储在低地址处,高位字节 34 存储在高地址处,因此以整数形式输出时,反映了这种存储顺序。
  4. 为什么不是 31323334

    • 如果是 31323334,那意味着程序以大端序方式(高位字节在低地址处)解释这些字节,这通常不是现代计算机的默认方式。现代计算机大多数采用小端序存储,因此输出的结果是 34333231

综上所述,输出的十六进制值 34333231 是根据小端序存储方式下字符的 ASCII 码值在内存中的排列顺序决定的。

假设我们有一个四字节(32位)的整数 0x12345678 在内存中的表示。在小端序存储下,它会按照以下方式存储在内存中的连续四个字节:

在这个例子中:

  • 内存地址从低到高依次是 0x10000x10010x10020x1003
  • 整数 0x12345678 的最低有效字节 78 存储在最低地址 0x1000 处。
  • 随后的字节 563412 分别按照顺序存储在接下来的高地址处。

这种排列方式反映了小端序存储的特性,即低位字节存储在低地址处,高位字节存储在高地址处。这种存储方式对于计算机架构和处理器的设计有重要影响,因为它决定了如何解释存储在内存中的数据。

当解决了输出顺序的问题,开头的问题也随之解决;

不论是文本文件还是二进制文件在文件系统中都是以二进制数据流在传输,当使用read读取文本文件时,使用字符数组的原因在于字符数组可以按字节存储字符文本。最后输出字符数组即可;

当使用read去读文本文件时,用整型变量去存文本文件时,int在测试的系统中占4字节,所以输出结果中刚好存下1234这个四个字符的大小,但是直接用%xd输出则是这四个字符的ASCII码值的十六进制表示;再因为小端序储存所以输出34333231;

要解决问题可以直接把输出结果改成%c或%s输出;

存储到 int 变量中会按照整型数据的方式存储,而不是直接按字符存储。所以,如果将 "1234" 存储到 int 中,可能会得到一个整数值,而不是字符序列。

把int改成char

再把输出改成%c

这样就得到了文本文件中的字符;


3、得出结论:

在 C 语言中,字符数组是一种非常方便的数据结构,用于存储和操作字符串。对于将十六进制字符串转换为文本字符的问题,字符数组的使用有以下优势和特点:

  1. 内存管理和访问

    • 字符数组在 C 语言中使用非常广泛,因为它们允许直接存储和处理字符序列,包括字符串。在转换过程中,我们可以通过索引直接访问和修改数组的元素,这样能够高效地处理每对十六进制字符,并将其转换为相应的 ASCII 字符。
  2. 动态内存分配

    • 使用字符数组可以灵活地处理字符串的长度。在示例中,我们使用 malloc 动态分配内存来存储转换后的文本字符串。这使得程序可以处理不同长度的输入,而不需要预先定义固定大小的数组。
  3. 字符串终止符

    • C 语言中的字符串以 '\0' 结尾,这使得处理和操作字符串变得更加方便和安全。在示例中,我们在转换完成后,手动添加了 '\0' 终止符来确保字符串的完整性。
  4. 简洁性和性能

    • 字符数组提供了一种简洁且高效的方法来处理字符串转换任务。通过使用循环和逐对处理的方式,可以在不牺牲性能的情况下完成必要的数据转换操作。
  5. C 语言的特性

    • C 语言天生支持字符数组和指针操作,这使得处理字符串(包括 ASCII 和十六进制字符)的任务变得非常直接和灵活。

总之,字符数组在 C 语言中是一种非常适合处理字符串和字符序列的数据结构,特别是在需要进行类似于十六进制到 ASCII 字符的转换时。它们提供了足够的灵活性和性能,使得开发者能够有效地实现各种字符串操作。

虽然不同的数据在内存中的表现形式可能相同,但在读取时仍需按照数据最初存储的格式进行操作,以避免误读和解码错误等问题。

注意:

字符流的本质是一种数据流,它由一系列字符组成,每个字符都有对应的编码。在许多编程环境中,字符流通常指的是一系列字符构成的数据流,这些字符可以按顺序读取或写入。

  1. 文本文件中的结束符号:在文本文件中,通常使用特定的字符来表示文件的结束,如换行符 \n 或文件结束符 \0。这些符号并不总是以特定的形式出现在存储介质上,而是由读取程序解释。

  2. 二进制流:二进制流可以是任何数据的序列,包括字符流。二进制流不一定有明确的结束符号,它可能以特定的长度或特定的约定来表示数据的结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day9 —— 大数据技术之ZooKeeper

ZooKeeper快速入门系列 ZooKeeper的概述什么是ZooKeeper?ZooKeeper的特点和功能使用ZooKeeper的原因 ZooKeeper数据模型ZooKeeper安装ZooKeeper配置ZooKeeper命令行操作常见服务端命令 ZooKeeper的概述 什么是ZooKeeper? ZooKeeper是一个开源的分布式协…

FFmpeg编译4

CPUx86-64 TOOLCHAIN N D K / t o o l c h a i n s / x 8 6 6 4 − 4.9 / p r e b u i l t / l i n u x − x 8 6 6 4 S Y S R O O T NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64 SYSROOT NDK/toolchains/x866​4−4.9/prebuilt/linux−x866​4SYSROOTNDK/platforms/and…

PBR网络数据流量分流+NQA联动静态路由

一、实验目的: 企业有两个网段,业务1网段和业务2网段,拓扑图如下, 二、实验要求 pc1报文走左侧链路到达ar1,pc2报文走右侧链路到达ar1,且当ar2或者ar3发生故障时候,可以通过另一个设备到达ar1…

HCIA 19 结束 企业总部-分支综合实验(下)

3.6出口NAT配置可以访问互联网 配置NAT使内网可以访问公网8.8.8.8,当前总部PC1 PING不通公网地址8.8.8.8。 3.6.1总部配置NAT访问互联网 步骤1:配置NAT acl number 2000 rule 5 permit source 192.168.0.0 0.0.255.255 # interface GigabitEthern…

头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)

文章目录 延迟任务精准发布文章1)文章定时发布2)延迟任务概述2.1)什么是延迟任务2.2)技术对比2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现 3)redis实现延迟任务4)延迟任务服务实现4.1)搭建heima-leadnews-schedule模块4.2)数据库准备4.3)安装redis4.4)项目集成…

常用加密算法之 RSA 简介及应用

引言 相关博文: Spring Boot 开发 – 常用加密算法简介(一)常用加密算法之 SM4 简介及应用 一、RSA算法简介 RSA (Rivest-Shamir-Adleman) 算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonar…

基于动力学的六自由度机器人阻抗恒力跟踪控制

1.整个代码的控制流程图如下: 2.正逆运动学计算 略 3.动力学模型 采用拉格朗日法计算机械臂的动力学模型,其输入的是机械臂的关节角度、角速度和角加速度;其中M、C、G本别是计算的惯性力、科式力和重力项,相关部分如下&#xf…

【fastapi+mongodb】使用motor操作mongodb(三)

本篇文章介绍mongodb的删和改,下面是前两篇文章的链接: 【fastapimongodb】使用motor操作mongodb 【fastapimongodb】使用motor操作mongodb(二) delete delete 的用法基本和查找一致,包括delete_one(删除…

某大厂程序员吐槽:离职交接时,新人被工作量吓退,领导却污蔑我故意劝退新人,我怒晒工作短信反击证明,新人看了后也决定走人了!

一位知名大公司的程序员分享了他离职时的遭遇:在交接工作时,新进的同事因工作量过大而感到压力,但出乎意料的是,他们的领导却指责我故意吓唬新人。为了证明自己的清白,我晒出了工作短信作为反击,结果连新人…

Vue71-嵌套(多级)路由

一、需求 二、开发步骤 2-1、编写路由组件 2-2、编写路由规则 2-3、编写路由标签<router-link>、<router-view> 三、小结

网络编程之XDP、TC和IO_URING以及DPDK

一、网络编程常见的技术 在前面已经分析过了XDP、TC和eBPF。也基本把三者间的关系理清了&#xff0c;但现在又有一个疑惑涌了上来。在前面提到过的IO_URING和DPDK与这些技术有什么关系呢&#xff1f;其实只要认真的看过分析文章可能大家心里都已经基本清楚了。 正如在前面不断…

利用golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置

文章目录 前言一、prometheus发现方式二、监控指标注册架构图三、部分代码展示1.核心思想2.代码目录3、程序入口函数剖析4、settings配置文件5、初始化配置文件及consul6、全局变量7、配置config8、公共方法目录common9、工具目录tools10、service层展示11、命令行参数12、Make…

双指针算法——部分OJ题详解

目录 关于双指针算法&#xff1a; 1&#xff0c;对撞指针 2&#xff0c;快慢指针 部分OJ题详解 283.移动零 1089.复写零 202.快乐数 11.盛水最多的容器 611.有效三角形的个数 剑指offer 57.和为s的两个数字 15.三数之和 18.四数之和 关于双指针算法&#xff1a; …

6月20日(周四)A股行情总结:A股险守3000点,恒生科技指数跌1.6%

A股三大股指走弱&#xff0c;科创板逆势上扬&#xff0c;半导体板块走强&#xff0c;多股20CM涨停。中芯国际港股涨超1%。恒生科技指数跌超1%。离岸人民币对美元汇率小幅走低&#xff0c;20日盘中最低跌至7.2874&#xff0c;创下2023年11月中旬以来的新低&#xff0c;随后收复部…

免费一年SSL证书申请——建议收藏

免费一年SSL证书申请——建议收藏 获取免费一年期SSL证书其实挺简单的 准备你的网站&#xff1a; 确保你的网站已经有了域名&#xff0c;而且这个域名已经指向你的服务器。还要检查你的服务器支持HTTPS&#xff0c;也就是443端口要打开&#xff0c;这是HTTPS默认用的。 验证域…

nlp基础-文本预处理及循环神经网络

1 认识文本预处理 1 文本预处理及其作用 定义&#xff1a;文本送给模型之前&#xff0c;提前要做的工作 作用&#xff1a;指导模型超参数的选择 、提升模型的评估指标 举个例子&#xff1a; 思路常识&#xff0c;打造成 X Y关于Y&#xff1a;10分类标签是否均衡关于X&#xf…

cesium 添加 Echarts 饼图

cesium 添加 Echarts 饼图 1、实现思路 1、首先创建echarts饼图,拿到创建好的canvas 2、用echarts里面生成的canvas添加到cesium billboard中 2、示例代码 <!DOCTYPE html> <html lang="en"><head><

实验四:复合对象的基本应用

如果文章有写的不准确或需要改进的地方&#xff0c;还请各位大佬不吝赐教&#x1f49e;&#x1f49e;&#x1f49e;。朱七在此先感谢大家了。&#x1f618;&#x1f618;&#x1f618; &#x1f3e0;个人主页&#xff1a;语雀个人知识库 &#x1f9d1;个人简介&#xff1a;大家…

QT事件处理系统之五:自定义事件的发送案例 sendEvent和postEvent接口

1、案例 双击窗口,会发送 自定义事件,然后在事件过滤中心进行拦截处理自定义事件。 2、核心代码 /*解释:双击窗口时,将产生双击事件,然后该事件被包裹成一个对象,随后将会被发往event事件中心,然后进行事件的处理(Widget对象);因为m_lineEdit开启了事件过滤机制,所…

2025秋招NLP算法面试真题(二)-史上最全Transformer面试题:灵魂20问帮你彻底搞定Transformer

简单介绍 之前的20个问题的文章在这里&#xff1a; https://zhuanlan.zhihu.com/p/148656446 其实这20个问题不是让大家背答案&#xff0c;而是为了帮助大家梳理 transformer的相关知识点&#xff0c;所以你注意看会发现我的问题也是有某种顺序的。 本文涉及到的代码可以在…