一种奇怪的 c++ 代码现象
A strange c++ code phenomenon
看看这两个程序:
#1:
int main(){
ulong num = 100;
float *pFArr = new float[num];
if(!pFArr)return 0;
for(ulong i=0; i<num; i++)
pFArr[i] = 22.4f*(float)i - 11.4f;
ofstream file("fArr.dat");
if(!file){delete []pFArr; return 0;}
if(!file.write((char*)&num,sizeof(num))){file.close(); delete []pFArr; return 0;}
if(!file.write((char*)pFArr,num*sizeof(float))){file.close(); delete []pFArr; return 0;}
file.close();
delete []pFArr;
}
#2:
int main(){
ulong num = 100;
float *pFArr = new float[num];
if(!pFArr)return 0;
for(ulong i=0; i<num; i++)
pFArr[i] = 53.2f*(float)i - 22.5f;
ofstream file("fArr.dat");
if(!file){delete []pFArr; return 0;}
if(!file.write((char*)&num,sizeof(num))){file.close(); delete []pFArr; return 0;}
if(!file.write((char*)pFArr,num*sizeof(float))){file.close(); delete []pFArr; return 0;}
file.close();
delete []pFArr;
}
两者之间的唯一代码差异是数组元素的分配。但是,第一个程序保存了一个 404 字节的文件(4 字节用于"num",100*4 字节用于元素),而第二个程序保存一个 405 字节的文件!!
当我使用以下代码读取文件时:
int main(){
ulong num = 0;
float *pFArr = null;
ifstream file("fArr.dat");
if(!file)return 0;
if(!file.read((char*)&num,sizeof(num))){file.close(); return 0;}
pFArr = new float[num];
if(!pFArr){file.close(); return 0;}
for(ulong i=0; i<num; i++)
pFArr[i] = 0;
if(!file.read((char*)pFArr,num*sizeof(float))){delete []pFArr; file.close(); return 0;}
for(ulong i=0; i<num; i++)
cout<<pFArr[i]<<"n";
delete []pFArr;
file.close();
}
404 文件读取成功。
对于 405 文件,第二个"file.read"调用失败。当我忽略失败并继续显示数组元素时,我看到从 0 到 46 的元素被分配了正确的值,"pFArr[47]"元素有一个奇怪的值 (x.xxxxxe-0xx),数组的其余部分没有分配。
有人可以解释为什么会发生这种情况吗?
另一个问题:阿瓦斯特!总是阻塞阅读程序,代码怎么了?
感谢您的任何帮助
很有可能
,因为你是在默认文本模式下打开它,所以有一些翻译在幕后进行。这与这似乎是一个与数据相关的问题这一事实相吻合。
例如,Windows 可能会将n
字节转换为rn
序列。一个好主意是执行文件的十六进制转储,以查看其中是否包含此序列。
如果是这样,请确保改为以二进制模式打开它:
ofstream file("fArr.dat", ios_base::out | ios_base::binary);
事实上,您可能无论如何都希望这样做,只是为了避免将来出现潜在问题(对于所有读取/写入二进制信息的代码,例如您的阅读器程序)。
我认为
当你读出数字时,它没有正确转换为无符号的长整型。我很确定这是问题所在,因为您在数组索引 47 和 48 中的问题在 ASCII 表 a 0 中。您应该将字符转换为 ulong。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值