看看这两个程序:
#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字节的文件(“num”为4个字节,元素为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),其余的数组未分配。
有人可以解释为什么会发生这种情况吗?
另一个问题:Avast!总是阻止阅读程序,代码出了什么问题?
感谢您的帮助
答案 0 :(得分:2)
很有可能,因为您在默认文本模式下打开它,所以有一些翻译在幕后。这表明这似乎是一个与数据相关的问题。
例如,Windows可能会将\n
字节转换为\r\n
序列。一个好主意是对文件执行十六进制转储以查看其中是否包含此序列。
如果是,请确保以二进制模式打开它:
ofstream file("fArr.dat", ios_base::out | ios_base::binary);
实际上,您可能希望这样做只是为了避免将来出现潜在问题(所有代码读取/写入二进制信息,例如您的读取器程序)。
答案 1 :(得分:0)
我认为当你读出这个号码时,它没有被正确转换为无符号长号。我很确定这是问题,因为你在数组索引47和48有一个问题在ASCII表中是0.你应该将字符转换为ulong。