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

news2025/1/18 14:44:22

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

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

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

相关文章

1.Triangle

一、你好,三角形 在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。 3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphi…

松下课堂 | 什么是EPS?通过马达来辅助转向操作的系统

EPS , 松下 EPS是一种通过马达来减轻和辅助驾驶员在转向操作时所需力量的设备。此外,通过采用EPS,可望提高燃效,降低车辆重量。。。 背景 EPS是一种通过马达来减轻和辅助驾驶员在转向操作时所需力量的设备。此外,通过采用EPS&…

深度学习笔记: 最详尽解释欠拟合(高偏差)和过拟合(高方差)

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! 欠拟合(高偏差)和过拟合(高方差) 在机器学习和统计建模中…

卡码网KamaCoder 98. 所有可达路径

题目来源&#xff1a;https://kamacoder.com/problempage.php?pid1170 C题解1&#xff1a;深度优先搜索&#xff0c;邻接矩阵 #include <iostream> #include <vector> using namespace std; vector<vector<int>> result; vector<int> path;voi…

毫秒级响应!清科优能应用 TDengine 建设虚拟电厂运营管理平台

小T导读&#xff1a;在清科优能的虚拟电厂运营管理平台建设中&#xff0c;项目初期预计涉及约一万台设备、总数据采集量达数十万&#xff0c;在数据库选择上&#xff0c;其希望能支持至少两千台设备的并发数据处理。本文介绍了清科优能的数据库选型经验以及最终应用效果&#x…

基于jmeter+perfmon的稳定性测试记录!

最近承接了项目中一些性能测试的任务&#xff0c;因此决定记录一下&#xff0c;将测试的过程和一些心得收录下来。 说起来性能测试算是软件测试行业内&#xff0c;有些特殊的部分。这部分的测试活动&#xff0c;与传统的测试任务差别是比较大的&#xff0c;也比较依赖工具&…

数据结构和算法(1) ---- Queue 的原理和实现

Queue 的定义和结构 队列(Queue) 是只允许在一端进行插入&#xff0c;在另一端进行删除的线性表 队列是一种先进先出(First In First Out)的线性表&#xff0c;简称 FIFO(First IN First OUT), 允许插入的一端称为队尾, 允许删除的一端称为队列头 队列的基本结构如下图所示&a…

百老开通知识星球啦,数据要素、数据治理等资料迅速扩散!

1.写在前面&#xff1a; 做数据相关工作有一些年头了&#xff0c;手里也积攒了几千份案例、解决方案、考试认证资料、数据要素研报等材料&#xff0c;形成自我的架构参考库&#xff0c;按TOGAF开发方法&#xff0c;分别形成标准信息库&#xff08;Standards Information Base&…

【论文通读】SeeClick: Harnessing GUI Grounding for Advanced Visual GUI Agents

SeeClick: Harnessing GUI Grounding for Advanced Visual GUI Agents 前言AbstractMotivationMethodGUI grounding for LVLMsData ConstructionTraining Details ScreenSpotExperimentsGUI Grounding on ScreenSpotVisual GUI Agent TasksMiniWobAITWMind2WebOther experiment…

使用Inno Setup 6制作软件安装包

制作软件安装包的工具非常多&#xff0c;比如SetupFactory、NSIS、Advanced Installer等等&#xff0c;都可以制作不同样式的软件安装包&#xff0c;但是在这些软件里面&#xff0c;Inno Setup最好&#xff0c;原因是他可以定制化个性的安装界面和卸载界面&#xff0c;只是难度…

贪心推公式——AcWing 125. 耍杂技的牛

贪心推公式 定义 贪心算法是一种在每一步选择中都采取在当前状态下最优的选择&#xff0c;希望通过局部的最优选择来得到全局最优解的算法策略。 运用情况 问题具有最优子结构&#xff0c;即一个问题的最优解包含其子问题的最优解。可以通过局部最优决策逐步推导到全局最优…

带百分比的进度条控件(ProgressBar)源码

带百分比的进度条控件&#xff08;ProgressBar&#xff09;&#xff1a; 源码下载地址&#xff1a;https://download.csdn.net/download/wgxds/89472915

48-5 内网渗透 - JuicyPotato、Pipe Potato提权

Juicy Potato Juicy Potato 与 Rotten Potato(烂土豆) 的原理几乎完全相同,只是在后者的基础上做了扩展,以便更灵活地利用 Rotten Potato。Juicy Potato 不再像 Rotten Potato 那样依赖于一个现有的 Meterpreter,并且可以自定义 COM 对象加载的端口,以及根据系统版本更换…

【AWS SMB 能力最佳实践】利用 MGN 解决方案实现跨AWS账号迁移Amazon EC2 实例、弹性IP地址等资源

文章目录 一、实验情景二、实验关键服务概述2.1 MGN解决方案2.2 VPC对等连接 三、实验架构示意图四、实验具体操作步骤4.0 创建访问密钥4.1 创建VPC资源4.1.1 在源账号上创建VPC4.1.2 在目标账号上创建VPC 4.2 创建对等连接✨4.2.1 发起对等连接请求4.2.2 接受对等连接请求4.2.…

vue上传文件拿到File,下载文件到本地

vue中使用upload组件上传pdf文件&#xff0c;拿到File内容后&#xff0c;下载pdf文件到本地vue中根据url下载pdf文件到本地 File文件内容的格式 注意&#xff1a;如果使用iview的upload组件上&#xff0c;要获取File文件&#xff0c;需要在before-upload钩子上获取 async down…

分治精炼宝库----归并排序应用( ´◔︎ ‸◔︎`)

目录 一.基本概念: 二.归并排序&#xff1a; 三.交易逆序对总数&#xff1a; 四.计算右侧小于当前元素的个数&#xff1a; 五.翻转对&#xff1a; 六.合并k个有序链表&#xff1a; 一.基本概念: &#x1f43b;在计算机科学中&#xff0c;分治法是一种很重要的算法。字面上的…

深入理解数据仓库建模——数据湖、数仓一体化

引言 在当今数据驱动的时代&#xff0c;数据仓库和数据湖的结合已经成为企业数据管理的关键。本文将深入探讨数据湖与数据仓库一体化的概念、优势以及实现方法&#xff0c;并结合实际案例&#xff0c;为大家展示如何有效地实现这一目标。 数据湖与数据仓库的区别 数据湖和数…

服务器数据恢复—raid5热备盘同步失败导致阵列崩溃如何恢复数据?

服务器存储数据恢复环境&故障&#xff1a; 某品牌DS5300存储&#xff0c;包含一个存储机头和多个磁盘柜&#xff0c;组建了多组RAID5磁盘阵列。 某个磁盘柜中的一组RAID5阵列由15块数据盘和1块热备硬盘组建。该磁盘柜中的某块硬盘离线&#xff0c;热备盘自动替换并开始同步…

基于YOLOv5+pyqt5的口罩佩戴检测系统(PyQT页面+YOLOv5模型+数据集)

简介 在各种工作环境和公共场所,确保人们正确佩戴口罩对个人防护和公共卫生至关重要,尤其是在医疗设施、制造业车间和拥挤的公共交通中。为了满足这一需求,我们开发了一种基于YOLOv5目标检测模型的口罩佩戴检测系统。本项目不仅实现了高精度的口罩佩戴检测,还设计了一个可…

STM32上实现spwm调制原理分析

在STM32微控制器上实现SPWM&#xff08;正弦脉宽调制&#xff0c;Sinusoidal Pulse Width Modulation&#xff09;调制的核心是利用高频载波&#xff08;三角波&#xff09;与低频基波&#xff08;正弦波&#xff09;作比较得出。 那么在STM32里三角波和正弦波分别是什么&…