fopen 参数'rb' 与'rb+'引发的黑色血案

2023-10-30

目录

一.背景

二.代码说明

1.下面是出错的代码

2.如何变正常的

三 问题分析

1.关于rb与rb+的区别

2.关于fread的两种形式说明

3.原因分析



一.背景

为了把windows上的算法库移植到linux上,文件读写部分去掉了CreateFile ,换成了fopen,一切都是很平稳,没啥编译错误,但是当我运行读图软件的时候,一张黑色的图片出现了,so, what the fffffff~~~

正常打开是下面这样子的

二.代码说明

1.下面是出错的代码

    FILE* hFile;
	errno_t err = fopen_s(&hFile, pchFileName, "rb+");//这里是rb+
	if (err != 0)
	{
		return IP_RV_FILEERR;
	}

	// read header
	memset(pTmapInfo, 0, sizeof(MAP_INFO));
	unsigned int nReadLength = sizeof(MAP_HEADER);
	rewind(hFile);
	int count = _fread_nolock(pTmapInfo, nReadLength, 1, hFile);

	if (count != 1)
	{
		fclose(hFile);
		return IP_RV_FILEERR;
	}

用这段代码,后面的fread各种返回都是1(正常的),但是显示的时候,都是黑的(明显是数据没读去正确)

2.如何变正常的

FILE* hFile;
	errno_t err = fopen_s(&hFile, pchFileName, "rb");//只是换成了rb
	if (err != 0)
	{
		return IP_RV_FILEERR;
	}

只是换成了rb,就可以了

三 问题分析

1.关于rb与rb+的区别

函数原型:FILE * fopen(const char * path,const char * mode);
  相关函数:open,fclose,fopen_s,_wfopen
  返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中
  参数说明:
  参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
  r 以只读方式打开文件,该文件必须存在。
  r+ 以可读写方式打开文件,该文件必须存在。
  rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。

       rb :读方式打开一个二进制文件,不允许写数据,文件必须存在
  w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

  w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
  a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
  a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
  wb 只写打开或新建一个二进制文件;只允许写数据。
  wb+ 读写打开或建立一个二进制文件,允许读和写。
  ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
  wx 创建文本文件,只允许写入数据。[C11]
  wbx 创建一个二进制文件,只允许写入数据。[C11]
  w+x 创建一个文本文件,允许读写。[C11]
  wb+x 创建一个二进制文件,允许读写。[C11]
  w+bx 和“wb+x”相同[C11]
  以x结尾的模式为独占模式,文件已存在或者无法创建(一般是路径不正确)都会导致fopen失败。文件以操作系统支持的独占模式打开。[C11]

2.关于fread的两种形式说明

首先fread的返回值是真实读取到的元素个数(从0 到N,0 表示没有读到)

1.

fread( buf, sizeof buf, 1, file ); // 'file' is valid open 'FILE *'

 如果用这种方式,fread 要么全部读取到,要么什么也读不到,fread读不到比sizeof buf 尺寸小的内容

2.

fread( buf, 1, sizeof buf, file );

 这种方式允许你尽可能的读到更多的by,即便文件里面可读的内容小于 sizeof(buf),它会返回真正读到的元素个数。

见:https://stackoverflow.com/questions/47923110/fread-parameters-2-and-3

3.原因分析

按道理rb与rb+唯一的区别在于rb+可读可写,只是写在文件末尾,我的代码里面没有涉及到写操作,不会出错才对,目前暂不清楚原因,回头有时间抽空写个DEMO 捋一下

 

 

未完待续~~

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fopen 参数'rb' 与'rb+'引发的黑色血案 的相关文章

  • [Pytorch系列-50]:卷积神经网络 - FineTuning的统一处理流程与软件架构 - Pytorch代码实现

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121363706 目录 第1章 关于F
  • DCMM数据能力成熟度评估模型--学习笔记(1)

    DCMM数据能力成熟度评估模型 学习笔记 1 DCMM简介 结构组成和成熟度评估等级划分 1 1 DCMM简介 1 2 DCMM结构组成 1 3 DCMM关键过程域 1 3 1 数据战略 指导方针 1 3 2 数据治理 机制保障 1 3 3
  • MySQL学习笔记

    我们经常用到的简单MySQL语句 做一个总结 对于没有基础的同学也有帮助 对于有基础的同学可以参考作为借鉴 狂神说Java 1 连接数据库语句 mysql h 服务器主机地址 u 用户名 p 用户密码 注意 p后面不能加空格 否则会被当做密
  • Servlet学习(六):Response对象

    1 Response设置响应数据功能介绍 HTTP响应数据总共分为三部分内容 分别是响应行 响应头 响应体 对于这三部分内容的数据 respone对象都提供了哪些方法来进行设置 响应行 对于响应头 比较常用的就是设置响应状态码 void s
  • docker Error response from daemon 解决

    docker Error response from daemon pull access denied for xxx repository does not exist or may require docker login denie
  • Android Studio 导入Eclipse项目

    将Eclipse项目或者其他的Android项目导入Android 会因为项目结构不一样 或者下载的grandle版本不一致 经常会导致import project卡死 解决的简单办法 首先 打开Android studio 然后impor
  • Linux shell:判断变量是否包含某个字符串的几种方法

    方法一 利用grep查找 strA long string strB string result echo strA grep strB if result then echo 包含 else echo 不包含 fi 先打印长字符串 然后在
  • Vuejs Prop基本用法

    一 使用Prop传递数据 组件实例的作用域是孤立的 这意味着不能并且不应该在子组件的模板内直接引用父组件的数据 可以使用props把数据传给子组件 prop是父组件用来传递数据的一个自定义属性 子组件需要显示的地用props选项声明 pro
  • 异常:java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher

    首先声明一点 导致这个异常的情况有很多种可能 我只是说一下我遇到的异常解决办法 java lang ClassNotFoundException org springframework web servlet Dispatcher 可能原因
  • Wwise音频解决方案概述

    Wwise编辑器 音频设计师在Wwise编辑器 具体使用请参考 Wwise Help 中完成声音的集成和设置 并通过UE4和unity的Wwise插件 将制作好地资源导入到游戏编辑器中 Wwise编辑器是一款插件式架构的工具 其功能由众多插
  • 使用vue+百度接口实现关键词搜索

    html代码块 div 请输入关键词 div
  • Java11安装遇到C:\ProgramData\Oracle\Java\javapath\java.exe”

    1 官网下载java11 发现根本就找不到了 官网上放置的是最新的 之前版本我找不到 只有去别人那里拿 如果你刚好也想要 可以私聊我 我到时候发给你 2 下载完成直接下一步安装就OK了 但会发现只有jdk没有jre 其实根本没必要生成出jr
  • el-dialog实现可拖曳并且可点击底层页面

    el dialog实现可拖曳并且可操作底层页面 拖曳 1 新建文件 directives js import Vue from vue v dialogDrag 弹窗拖拽属性 Vue directive dialogDrag bind el
  • 【海思SS626

    目录 一 概述 二 安装交叉编译工具 2 1 安装 aarch64 mix410 linux tgz 2 2 安装 cc riscv32 cfg11 musl 20220523 elf tar gz 2 3 检查工具链版本 打印版本则表示安
  • Android 性能优化系列:启动优化进阶

    文章目录 启动速度优化的本质因素 CPU 层面进行速度优化 减少程序的指令数 降低时钟周期时间 降低每条指令的平均时间周期 缓存层面进行速度优化 缓存的读写速度 缓存的命中率 任务调度层面进行速度优化 通过实时进程和普通进程了解任务调度机制
  • 有了 screen 和 nohup 跑深度学习代码再也不用愁了

    在服务器上跑深度学习代码 xshell断开代码就挂掉了 如何能在服务器运行程序的时候 即使关闭终端也不会影响代码呢 screen 我用的是screen 推荐这个方法 我感觉比nohup好用一万倍 1 连接服务器 下图我连接了88 99 这个
  • java基础学习总结——面向对象1

    目录 一 面向过程的思想和面向对象的思想 二 简单理解面向对象 三 面向对象的设计思想 四 对象和类的概念 五 如何抽象出一个类 六 类 对象 之间的关系 七 Java与面向对象 八 为什么使用面向对象编程 一 面向过程的思想和面向对象的思
  • [C++]:for循环for(int num : nums)

    前言 时不可以苟遇 道不可以虚行 一 基于范围的for循环的基本语法 在c 11里 为for循环 添加一个container 它就会自动迭代 实现了对于vector型变量vec的内容打印 变量i遍历vector中的每一个元素 直到vecto

随机推荐

  • 解决RabbitMQ报错问题

    解决RabbitMQ报错问题 rabbitmq server service RabbitMQ broker Loaded loaded usr lib systemd system rabbitmq server service disa
  • 周志华《机器学习》课后习题解答系列(六):Ch5.10 - 卷积神经网络实验

    本系列相关答案和源代码托管在我的Github上 PY131 Machine Learning ZhouZhihua 卷积神经网络实验 手写字符识别 注 本题程实现基于python theano 这里查看完整代码和数据集 1 基础知识回顾 1
  • 使用PowerShell脚本来一键开启、关闭FTP服务

    可以使用PowerShell脚本来实现这一目标 下面是两个简单的PowerShell脚本 一个用于开启FTP服务 另一个用于关闭FTP服务 开启FTP服务 保存以下脚本为 Enable FTP ps1 开启IIS和FTP功能 Enable
  • Nextjs 的 App Router 路由模式核心概念简介

    Nextjs App Router 简介 Next js 13 引入了新的应用路由器 它建立在服务端组件之上 支持布局 嵌套路由 加载状态 错误处理等等 本文将介绍 App Router 新路由模型的基本概念 术语 树 Tree 一种用于可
  • neo4j--Cypher语法练习(LOAD CSV)

    1 21 LOAD CSV LOAD CSV用于从CSV文件中导入数据 CSV文件的URL可以由FROM后面紧跟的任意表达式来指定 需要使用AS来为CSV数据指定一个变量 LOAD CSV支持以gzip Deflate和ZIP压缩的资源 C
  • el-form表单回车提交,浏览器会刷新页面

    当el from 只有一个输入框时候 回车提交表单 刷新页面 原因 由于当表单只有一文本框时 按下回车将会触发表单的提交事件 从而导致页面刷新 解决办法 在 el from 加上 submit native prevent
  • 【经典】华为远程机试题分享(跟进)

    在上一篇博客中有说到面试的具体事儿 昨晚那种方法做出来之后 感觉可读性不好 也就是一般情况下很难看懂代码 所以接近睡着时我又想到一个办法比较简单 而且易懂 所以写这篇博客和大家分享一下吧 具体就围绕下图这个核心问题来做 其实我的想法很简单
  • 【Espruino】NO.18 使用L298N驱动直流电机

    http blog csdn net qwert1213131 article details 38584743 本文属于个人理解 能力有限 纰漏在所难免 还望指正 小鱼有点电 Espruino中文社区 小学时代玩过玩具四驱车 各种奇葩霸气
  • ChatGPT写小论文

    ChatGPT写小论文 只是个人对写小论文心得 从知乎 知网自己总结的 有问题 可以留个言我改一下 别删我的东西啊CSDN 文章目录 ChatGPT写小论文 1 写小论文模仿实战 狗头 0 小论文组成 1 好论文前提 2 标题 3 摘要 4
  • Transformer(三)--论文实现:transformer pytorch 代码实现

    转载请注明出处 https blog csdn net nocml article details 124489562 本系列传送门 Transformer 一 论文翻译 Attention Is All You Need 中文版 Tran
  • games101笔记 Shading

    什么是shading 不同的物体应用不同的材质的过程 就是计算出物体具体应该在的地方 物体的光照 物体本身应该有的材质 Blinn Phong Reflectance Model Blinn Phong反射模型 Blinn Phong Re
  • MySql执行顺序及执行计划

    一 mySql的执行顺序 mysql执行sql的顺序从 From 开始 以下是执行的顺序流程 1 FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积 生成Temp1 2 JOIN
  • Spring和springMVC启动流程

    首先Spring是建立在Servlet容器之上的 所有web工程的初始位置都是在web xml文件中 它配置了servlet的上下文 context 和监听器 listener spring的启动过程其实就是ioc的启动过程 1 首先初始化
  • linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置

    如果ping域名的时候出现ping unknown host xxx xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好 查看一下配置文件 etc resolv conf 里面是否有nameserver xxx x
  • 算力和硬件的关系_算力就是生产力:中国AI算力占全球三成

    12月15日 IDC与浪潮集团联合发布了 2020 2021中国人工智能计算力发展评估报告 报告从旨在评估中国人工智能发展的现状 为推动产业AI化发展提供极具价值的参考依据和行动建议 据报告显示 预计2020 年中国AI市场规模将达到 62
  • chatgpt(0)-pycharm-vscode安装使用插件Codeium-bito

    1 pycharm codeium 下载插件 codeium 登录 一直出现 Log In Codeium Free AI Code Completion Chat 2 pycharm bito 3 vscode bito 下载安装 注册登
  • 十六进制加法

    十六进制加法逢16进1位 注意 进位的那个位是 和 16 举例 0x21 0x3F 60 而不是 0x21 0x3F 6F
  • Proguard混淆工具使用方法图文说明

    Proguard的理论知识请看这篇文章 http www cnblogs com cr330326 p 5534915 html 1 下载Proguard 官网地址 http proguard sourceforge net 不墙很难打开
  • Sonar代码质量管理

    一 简介 1 1 什么是Sonar Sonar是一个用于代码质量管理的开源平台 用于管理代码的质量 是一个Web系统 展现了静态代码扫描的结果 通过插件形式可以支持二十几种语言的代码质量检测 通过多个维度的检查了快速定位代码中潜在的或者明显
  • fopen 参数'rb' 与'rb+'引发的黑色血案

    目录 一 背景 二 代码说明 1 下面是出错的代码 2 如何变正常的 三 问题分析 1 关于rb与rb 的区别 2 关于fread的两种形式说明 3 原因分析 一 背景 为了把windows上的算法库移植到linux上 文件读写部分去掉了C