VS2022的MFC的ReadString的问题

devtools/2024/11/29 20:19:27/

用vs2022CStdioFile类读取文件时,当文件中出现有一段0,不是字符串0而是16进制0,会导致直接读取结束,但实际文件还有很长,则后面的内容无法读入。
因为之前用过vc6的同样的函数ReadString进行读取是没有问题的。因此问题肯定出现在这个函数上。
将VS2022的ReadString的函数拷贝出如下:

BOOL CStdioFile::ReadString(CString& rString)
{
ASSERT_VALID(this);
rString = _T("");    // empty string without deallocating
const int nMaxSize = 128;
LPTSTR lpsz = rString.GetBuffer(nMaxSize);
LPTSTR lpszResult;
int nLen = 0;
for (;;)
{lpszResult = _fgetts(lpsz, nMaxSize+1, m_pStream);rString.ReleaseBuffer();// handle error/eof caseif (lpszResult == NULL && !feof(m_pStream)){Afx_clearerr_s(m_pStream);AfxThrowFileException(CFileException::genericException, _doserrno,m_strFileName);}// if string is read completely or EOFif (lpszResult == NULL ||(nLen = AtlStrLen(lpsz)) < nMaxSize ||lpsz[nLen-1] == '\n')break;nLen = rString.GetLength();lpsz = rString.GetBuffer(nMaxSize + nLen) + nLen;
}// remove '\n' from end of string if present
lpsz = rString.GetBuffer(0);
nLen = rString.GetLength();
if (nLen != 0 && lpsz[nLen-1] == '\n')rString.GetBufferSetLength(nLen-1);return nLen != 0;}

代码来源:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.35.32215\atlmfc\src\mfc\filetxt.cpp

VC6的对应函数源码:

BOOL CStdioFile::ReadString(CString& rString)
{
ASSERT_VALID(this);
rString = &afxChNil;    // empty string without deallocating
const int nMaxSize = 128;
LPTSTR lpsz = rString.GetBuffer(nMaxSize);
LPTSTR lpszResult;
int nLen = 0;
for (;;)
{lpszResult = _fgetts(lpsz, nMaxSize+1, m_pStream);rString.ReleaseBuffer();// handle error/eof caseif (lpszResult == NULL && !feof(m_pStream)){clearerr(m_pStream);AfxThrowFileException(CFileException::generic, _doserrno,m_strFileName);}// if string is read completely or EOFif (lpszResult == NULL ||(nLen = lstrlen(lpsz)) < nMaxSize ||lpsz[nLen-1] == '\n')break;nLen = rString.GetLength();lpsz = rString.GetBuffer(nMaxSize + nLen) + nLen;
}// remove '\n' from end of string if present
lpsz = rString.GetBuffer(0);
nLen = rString.GetLength();
if (nLen != 0 && lpsz[nLen-1] == '\n')rString.GetBufferSetLength(nLen-1);return lpszResult != NULL;}

经过对比,可以发现
原来最后的判断不同了,VS2022是判断指针是否为0(return lpszResult != NULL;),VC6是判断字符串长度是否为0(return nLen != 0;)

若是正常的文本,中间不会出现二进制0的。
但在处理异常情况下,VC6的函数就要优一些,至于为何VS2022的函数要这样修改,我还没有搞明白。
但现在我要处理的文件中有16进制0,文件又需要全部读完,用VS2022的函数就行。退回用VC6又不现实。
最后解决办法是,继承CStdioFile类,重写ReadString函数,或增加一个ReadString函数(改个名)。使用的函数内容从VC6的MFC源码中进行拷贝。问题得到解决。


http://www.ppmy.cn/devtools/138005.html

相关文章

深入解析 EasyExcel 组件原理与应用

EasyExcel 是一个为了简化 Excel 操作&#xff0c;而封装的一个 Java 工具库。它支持读写 Excel 97-2003 和 Excel 2007 格式的文件。 以下是一个使用 EasyExcel 读取 Excel 文件的简单示例&#xff1a; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.read…

透视投影(Perspective projection)与等距圆柱投影(Equirectangular projection)

一、透视投影 1.方法概述 Perspective projection&#xff08;透视投影&#xff09;是一种模拟人眼观察三维空间物体时的视觉效果的投影方法。它通过模拟观察者从一个特定视点观察三维场景的方式来创建二维图像。在透视投影中&#xff0c;远处的物体看起来比近处的物体小&…

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…

CKA认证 | Day4 K8s管理应用生命周期(下)

第四章 K8s管理应用程序生命周期&#xff08;下&#xff09; 1、Pod对象 1.1 Pod 的基本概念 Pod 是 Kubernetes 中最基本和最重要的概念之一&#xff0c;是一个逻辑抽象概念&#xff0c;Kubernetes创建和管理的最小单元&#xff0c; 一个Pod由一个容器或多个容器组成。它简…

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! ! &#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了…

Leetcode 13.罗马数字转整数

题目意在对数组的快速查找 思路&#xff1a;哈希表 首先创建哈希表&#xff0c;对字符以及对应的数据进行输入&#xff0c;当下一个字符小于或等于当前字符时&#xff0c;进行累加&#xff0c;否则减去当前字符的值 class Solution { public:int romanToInt(string s) {uno…

在 Django 中创建和使用正整数、负数、小数等数值字段

文章目录 在 Django 中创建和使用正整数、负数、小数等数值字段正整数字段&#xff08;Positive Integer&#xff09;PositiveIntegerField 负整数字段&#xff08;Negative Integer&#xff09;IntegerField 配合自定义验证 小数字段&#xff08;Decimal&#xff09;使用 Deci…

【力扣】541.反转字符串2

问题描述 思路解析 每当字符达到2*k的时候&#xff0c;判断&#xff0c;同时若剩余字符>k,只对前k个进行判断&#xff08;这是重点&#xff09;因为字符串是不可变变量&#xff0c;所以将其转化为字符串数组&#xff0c;最后才将结果重新转变为字符串 字符串->字符数组 …