2016-12-25 4 views
-1

Le code ici est utilisé pour créer un projet de carte de rapport d'étudiant. Tout en essayant de comprendre que nous ne pouvons pas comprendre l'utilisation et les fonctions du code ci-dessous:Que signifie reinterpret_cast <char *> (& st) et (-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

Quel est l'étudiant? Ce code le lisait comme binaire brut. C'est UB si le type d'étudiant n'est pas la disposition standard. Il a également un problème avec endianess – Danh

+0

La façon dont vous avez posé votre question suggère que vous ne comprenez pas vraiment ce que sont 'reinterpret_cast' et' static_cast'. – Omnifarious

Répondre

2

File.read(reinterpret_cast<char *> (&st), sizeof(student)); Reads les directement à partir d'un fichier de données de structure student dans la mémoire occupée par st.

La conversion est car read attend un char*, et c'est ainsi que vous convertissez un pointeur d'un type en un pointeur d'un type complètement indépendant. Ce code ne fonctionnera que si le fichier est écrit et lu en mode binaire, sans parler de pour créer le fichier et le lire sur la même machine pour être certain qu'il fonctionnera comme: attendu.

Même alors, si la structure contient des pointeurs, elle est probablement vouée à l'échec.


(-1)*static_cast<int>(sizeof(st)); tourne le résultat non signé de l'opérateur sizeof en un certain nombre signé, et multiplie par -1.


Les lignes ci-dessus comportent ce qu'on appelle . La raison de l'utilisation de ceux-ci, est que, contrairement à un casting de style , ils ne vont pas préformer un casting à tout prix. Ils ne lanceront que si les conditions de casting sont remplies, ce qui est beaucoup plus sûr.

La conversion de la signature non signée nécessite donc un static_cast, qui échouera si la vérification de type statique du compilateur ne tient pas.

reinterpret_cast est une bête beaucoup plus puissante (ce qui est nécessaire lorsque vous voulez ignorer quelque peu le système de type), mais a encore quelques précautions par rapport à une distribution de style c.