2014-01-10 5 views
0

Посмотрите на этих двух программ:Странный 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! всегда блокирует программу чтения, что не так с кодом?

Спасибо за любую помощь

+3

Есть ли причина, по которой вы не открываете файлы в двоичном режиме? –

+1

@RetiredNinja. Уверен, что это случайный \ n среди тех плавающих, которые преобразуются в \ r \ n –

+0

Извините, что я не знал об этом. Теперь я открыл его в двоичном режиме, и проблема исчезла, но Avast! по-прежнему блокирует программу! – Mohsin

ответ

2

Есть хороший шанс, что, поскольку вы открываете его в текстовом режиме по умолчанию, происходят некоторые переводы под обложками. Это связано с тем, что эта проблема связана с данными.

Например, Windows может преобразовывать \n байт в последовательность \r\n. Хорошей идеей было бы сделать шестнадцатеричный дамп файла, чтобы увидеть, имеет ли он эту последовательность в нем.

Если это произойдет, убедитесь, что вы открыть его в двоичном режиме вместо:

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

В самом деле, вы, вероятно, хотите сделать это в любом случае, только чтобы избежать возможных проблем в будущем (в все код, который читает/записывает двоичную информацию, такую ​​как ваша программа для читателей).

+0

Да, я сделал это, и теперь это сработало, но Аваст! все еще блокирует программу, вы можете увидеть любую другую проблему с кодом? – Mohsin

+0

Нет, похоже, что все в порядке, и я не вижу каких-либо очевидных вещей, таких как переполнение буфера или перенос после ошибок. Я должен открыть файл в двоичном режиме, а на всякий случай. Помимо этого, это может быть просто Avast, дающий ложноположительное обнаружение вируса в вашем коде. – paxdiablo

0

Я думаю, когда вы прочитать номер, он не преобразуется корректно в беззнаковое долго. Я уверен, что это проблема, потому что у вас есть проблема в индексе массива 47 и 48 в таблице ASCII a 0. Вы должны преобразовать символы в ulong.

Смежные вопросы