[英]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字節的文件(“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! 總是阻止閱讀程序,代碼有什么問題?
謝謝你的幫助
很有可能,因為你是在默認文本模式下打開它,所以有一些翻譯在幕后。 這凝聚了這似乎與數據相關的問題。
例如,Windows可能會將\\n
字節轉換為\\r\\n
序列。 一個好主意是對文件執行十六進制轉儲以查看其中是否包含此序列。
如果是,請確保以二進制模式打開它:
ofstream file("fArr.dat", ios_base::out | ios_base::binary);
實際上,您可能希望這樣做只是為了避免將來出現潛在問題(對所有讀取/寫入二進制信息的代碼,例如您的讀者程序)。
我想當你讀出這個數字時,它沒有正確轉換為無符號長整數。 我很確定這是問題,因為你在數組索引47和48有一個問題在ASCII表中是0.你應該將字符轉換為ulong。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.