簡體   English   中英

一個奇怪的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字節的文件(“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM