一个奇怪的c ++代码现象

时间:2014-01-10 08:41:28

标签: c++ fstream

看看这两个程序:

#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!总是阻止阅读程序,代码出了什么问题?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

很有可能,因为您在默认文本模式下打开它,所以有一些翻译在幕后。这表明这似乎是一个与数据相关的问题。

例如,Windows可能会将\n字节转换为\r\n序列。一个好主意是对文件执行十六进制转储以查看其中是否包含此序列。

如果是,请确保以二进制模式打开它:

ofstream file("fArr.dat", ios_base::out | ios_base::binary);

实际上,您可能希望这样做只是为了避免将来出现潜在问题(所有代码读取/写入二进制信息,例如您的读取器程序)。

答案 1 :(得分:0)

我认为当你读出这个号码时,它没有被正确转换为无符号长号。我很确定这是问题,因为你在数组索引47和48有一个问题在ASCII表中是0.你应该将字符转换为ulong。