首页 > 系统相关 >Windows下读文件二进制模式和文本模式的区别

Windows下读文件二进制模式和文本模式的区别

时间:2023-11-30 10:23:13浏览次数:74  
标签:字符 文件 Windows 模式 二进制 下读 文本

前段时间,碰到了一个奇怪的事情,我实现了一个读某文件的类,原本这个文件是以二进制写的,读的时候没太在意,将模式少写了一个“b”,变成了文本模式

_tfopen_s(&pFile, m_file, _T("r"))

测试了好些文件都没有问题,直到有一天,一同事反应读取函数有问题,数据被截断了。我看了半天,百思不得其解。抱着试试的态度,把模式改成了“rb"后,一切又恢复了正常。问题是解决了,但是,对于文本模式与二进制模式的区别,却始终没有搞清楚。

直到昨天,一同事发给我一段文字:

二进制与文本模式

文本流是能组合成行(零或更多字符加上终止的 '\n' )的有序字符序列;行能分解成零或多个字符加一个终止的 '\n' (“换行”)字符。最后一行是否要求终止的 '\n' 是实现定义的。另外,可能必须在输入与输出时添加、切换或删除字符,以符合 OS 中的表示文本(尤其是 Windows OS 上的 C 流在输出时将 '\n' 转换为 '\r\n' ,输入时将 '\r\n' 转换为 '\n' )。

仅若下列条件全为真,从文本流读取的数据才保证与先前写出到该文本流者比较相等:

  • 数据由打印字符和/或控制字符 '\t' 及 '\n' 组成(尤其是 Windows OS 上,字符 '\0x1A' 终止输入)。
  • 无立即为空格符所前驱的 '\n' 字符(当这种输出随后作为输入读入时,这种空格字符可能消失)。
  • 末字符是 '\n' 。

二进制流是能通透地记录内部数据的有序字符序列。从二进制流读取的数据始终与先前写出到该流者比较相等,除了允许实现后附不确定数量的空字符到流结尾。宽二进制流不必终止于初始迁移状态。

原来,在Windows系统下以文本模式读文件时,遇到0x1A即认为文件结束(EOF),因此,文件被截断了。我验证了一下我读的文件,确实如此,如下图:

图1 文件二进制

图2 调试器结果

从图2可以看出只读了check_sum这一个字段,我将9547011转换为16进制是:0x91AD03

 和图1进行对比,考虑到字节序问题,也就说在0x1A处被截断了。

关于Windows系统为什么会将0x1A认为是EOF(现在这个值是-1),这是一个历史问题,最多的说法是,在早期0x1A就是EOF,这个故事很长,想了解详情的可以自己查阅。

参考:

【1】https://zh.cppreference.com/mwiki/index.php?title=cpp/io/c/FILE&variant=zh

【2】https://blog.csdn.net/zhoubl668/article/details/7054282

 

标签:字符,文件,Windows,模式,二进制,下读,文本
From: https://www.cnblogs.com/kuaixue/p/17866696.html

相关文章

  • 使用Win-ACME在Windows+iis服务器下配置自动续期SSL证书
    使用Win-ACME在Windows+iis服务器下配置自动续期SSL证书 由于网站建设和小程序开发等都需要https,但是ssl证书有过期的限制,如果没有及时续期ssl证书,那么将会影响线上程序正常运行,因此我便找了很多可以在windows服务器下使用的自动续期证书的工具。win-acme,github地址:https:/......
  • 国密算法SM4的GCM模式加密解密实现
    importorg.bouncycastle.util.encoders.Hex;importjava.util.Arrays;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassSM4Utils{/***默认SECRET_KEY*secretKey必须为16位,可包含字母、数字、标点*/ privatestat......
  • 简单工厂模式
    软件设计                 石家庄铁道大学信息学院 实验2:简单工厂模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解简单工厂模式的动机,掌握该模式的结构;2、能够利用简单工厂模式解决实际问题。 [实验任务一]:女娲造人使用简单工厂模......
  • 工厂方法模式
    软件设计                 石家庄铁道大学信息学院 实验3:工厂方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解工厂方法模式的动机,掌握该模式的结构;2、能够利用工厂方法模式解决实际问题。 [实验任务一]:加密算法目前常用的加密......
  • 抽象工厂模式
    软件设计                 石家庄铁道大学信息学院 实验4:抽象工厂模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解抽象工厂模式的动机,掌握该模式的结构;2、能够利用抽象工厂模式解决实际问题。 [实验任务一]:人与肤色使用抽象工厂模......
  • 建造者模式
    软件设计                 石家庄铁道大学信息学院 实验5:建造者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解建造者模式的动机,掌握该模式的结构;2、能够利用建造者模式解决实际问题。 [实验任务一]:计算机组装使用建造者模式,完成......
  • 命令模式
    [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。1. 提交类图;2.提交源代码;#include<iostream>#include<stack>usingn......
  • 适配器模式
    1模式动机在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象(老接口)的良好实现,同时又能满足新的应用环境所要求的接口?Adapter模式主要应用于“......
  • Windows XP
    WindowsXPhttps://baike.baidu.com/item/WindowsXP/191927密钥RT4H2-8WYHG-QKK6K-WWHJ2-9427Xxp系统安装产品密钥是什么windows批量许可证产品密钥http://www.caeworld.cn/win7jc/143347.html......
  • 实验6:原型模式
    2.提交源代码(用C++完成);3.注意编程规范。#include<iostream> classVector{private:    int*data;//指向向量数据的指针    intsize;//向量的长度 public:    //构造函数    Vector(intsize){        this->size=size;   ......