Посмотрите на этих двух программ:Странный C++ код явление
# 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), а остальная часть массив не был назначен.
Может кто-нибудь объяснить, почему это происходит?
Другая проблема: Avast! всегда блокирует программу чтения, что не так с кодом?
Спасибо за любую помощь
Есть ли причина, по которой вы не открываете файлы в двоичном режиме? –
@RetiredNinja. Уверен, что это случайный \ n среди тех плавающих, которые преобразуются в \ r \ n –
Извините, что я не знал об этом. Теперь я открыл его в двоичном режиме, и проблема исчезла, но Avast! по-прежнему блокирует программу! – Mohsin