2016-12-25 11 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です。また、エンディアンに問題があります – Danh

+0

あなたの質問には、reinterpret_castとstatic_castの内容が本当に分かりません。 – Omnifarious

答えて

2

File.read(reinterpret_cast<char *> (&st), sizeof(student));stによって占有メモリにファイルから直接student構造データを読み込みます。

readにはchar*が必要なので、キャストがあります。これは、1つのタイプのポインタを完全に無関係なタイプのポインタに変換する方法です。

このようなコードは、バイナリモードでファイルを書き込んだり読み込んだりするときにのみ機能します。にはがあります。期待される。

それでも、構造体にポインタが含まれていると、失敗する可能性があります。


(-1)*static_cast<int>(sizeof(st));は、署名された数にsizeofオペレータの符号なしの結果になり、-1を乗算します。


上記の行には、スタイルのキャストがあります。それらを使用する理由は、スタイルのキャストとは異なり、キャストをどのような費用でもプリフォームしないためです。キャスティングの条件が満たされた場合にのみキャストされます。これははるかに安全です。

符号なしから符号付きのみをキャストする場合は、static_castが必要です。コンパイラの静的型チェックが成立しない場合は失敗します。

reinterpret_castは、より強力な獣です(タイプシステムを多少無視したい場合に必要です)が、Cスタイルのキャストに比べていくつかの安全対策があります。

関連する問題