2016-12-25 30 views
-1

Код здесь используется для создания проекта карточки студенческого отчета. Пытаясь понять, что мы не можем понять, использование и функции кода ниже:Что делает reinterpret_cast <char *> (& st) и (-1) * static_cast <int> означает?

File.read(reinterpret_cast<char *> (&st), sizeof(student)); 

int pos=(-1)*static_cast<int>(sizeof(st)); 

File.read(reinterpret_cast<char *> (&st), sizeof(student)); 
if(st.retrollno()==n) 
    { 
    st.showdata(); 
    cout<<"\n\nPlease Enter The New Details of student"<<endl; 
     st.getdata(); 
      int pos=(-1)*static_cast<int>(sizeof(st)); 
      File.seekp(pos,ios::cur); 
      File.write(reinterpret_cast<char *> (&st), sizeof(student)); 
      cout<<"\n\n\t Record Updated"; 
      found=true; 
    } 
+0

Что студент? Этот код читал как сырой двоичный файл. Это UB, если тип ученика не является стандартным макетом. У него также есть проблемы с endianess. – Danh

+0

. Как вы задали свой вопрос, вы не понимаете, что такое 'reinterpret_cast' и' static_cast'. – Omnifarious

ответ

2

File.read(reinterpret_cast<char *> (&st), sizeof(student)); Считывает структуру данных student непосредственно из файла в память занятую st.

Литой вариант заключается в том, что read ожидает char*, и именно так вы конвертируете указатель одного типа в указатель совершенно несвязанного типа.

Такой код будет работать только тогда, когда файл записывается и читается из двоичного режима, не говоря уже о том, что вы в основном имеете, чтобы создать файл и прочитать его на той же машине, чтобы убедиться, что он будет работать как ожидается.

Даже тогда, если структура содержит указатели, она, скорее всего, обречена на провал.


(-1)*static_cast<int>(sizeof(st)); получается без знака результата sizeof оператора в знаковом число, и умножает его на -1.


В приведенных выше строках есть то, что называется -стиле. Причина их использования заключается в том, что в отличие от приклада , они не будут преформировать бросок любой ценой. Они будут выполняться только при условии соблюдения условий литья, что намного безопаснее.

Таким образом, для отливки без знака для подписания требуется только static_cast, что не удастся, если проверка статического типа компиляторов не выполняется.

reinterpret_cast - гораздо более мощный зверь (который требуется, если вы хотите несколько игнорировать систему типов), но все же имеет некоторые гарантии по сравнению с приведением в стиле c.