当缓冲区为CString时,ReadFile的怪异行为
ReadFile weird behavior when buffer is CString
我继承了使用ReadFile
Windows API方法在循环中从并行端口读取单个字节的代码。
代码传递CString
实例作为缓冲区参数,传递1作为要读取的字节数,如下所示:
CString inBuffer = "";
bResult = ReadFile(hCom, inBuffer.GetBuffer(1), 1, &nBytesRead, NULL);
allData += inBuffer.GetBuffer(1);
它用这个代码工作了很长一段时间,但有时会引起奇怪的问题,例如,从机器发送的"AV01000"输入被读取为"AkVk0k1k0k0"——不知何故,在读取每个字符后都添加了一些随机字符。
我花了很长时间才弄清楚这种行为的来源,并且在将代码更改为:之后
char buffer = ' ';
bResult = ReadFile(hCom, &buffer, 1, &nBytesRead, NULL);
allData += buffer;
它工作完美,读取了机器发送的确切数据。
这是CString
内部代码中的某种缓冲区溢出吗?如果不是的话,如何解释这种奇怪的行为?
删除地址运算符:
bResult = ReadFile(hCom, inBuffer.GetBuffer(1), 1, &nBytesRead, NULL);
另外:不要忘记对ReleaseBuffer的匹配调用。添加字符
allData += inBuffer;
应该足够了。
首先,CString根据您为项目选择的编码进行操作。如果您的项目是Unicode格式,则每个字符都存储在以两个字节表示的CString字符中(WCHAR(。如果文件和对象具有相同的编码,它将正常工作。(也可以通过分析开头的BOM字符来确定文件编码(
您传递的缓冲区大小为1。如果您仍然想使用CString对象,请通过调用GetFileSize((API传递文件长度来传递缓冲区的正确大小。
我建议你使用缓冲区分配的方法。
像
char* pReadbuff = new char[sizeoffile];
ReadFile(..);
CString objStr = pReadbuff;
delete pReadbuff;
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 带有动态缓冲区的Windows readfile
- ReadFile缓冲区是否需要被清空?
- ReadFile只读取一个缓冲区字符
- 当缓冲区为CString时,ReadFile的怪异行为