2016-12-25 13 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));st에 의해 점유 된 메모리에 파일에서 직접 student 구조 데이터를 읽습니다.

readchar*을 필요로하기 때문에 캐스트가 발생합니다. 이는 한 유형의 포인터를 완전히 관련없는 유형의 포인터로 변환하는 방법입니다.

이러한 코드는 파일이 바이너리 모드로 쓰여지고 읽을 때만 작동합니다. 물론 입니다. 파일을 만들고 동일한 컴퓨터에서 읽을 수 있습니다. 예상했다.

그렇다고해도 구조체에 포인터가 포함되어 있으면 실패 할 가능성이 높습니다.


(-1)*static_cast<int>(sizeof(st));는 부호 번호로 sizeof 연산자의 결과를 부호 켜지고 -1하여 곱한다.


위의 줄에는 스타일이 사용되었습니다. 이들을 사용하는 이유는 스타일의 캐스트와 달리 어떤 비용으로도 캐스트를 프리폼하지 않기 때문입니다. 캐스팅 조건이 충족되면 캐스팅 만 수행되므로 훨씬 안전합니다.

부호없는 부호를 부호 첨부로만 변환하려면 static_cast이 필요하며 컴파일러 정적 유형 검사가 실패하면 실패합니다.

reinterpret_cast은 (훨씬 형식 시스템을 무시하고 싶을 때 필요합니다.) 그러나 C 스타일의 캐스트와 비교하여 몇 가지 안전 장치가 있습니다.