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

A strange c++ code phenomenon

本文关键字:c++ 代码 一种      更新时间:2023-10-16

看看这两个程序:

#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。