2017-11-01 9 views
0

필자는 Perl, PHP 및 어셈블러를 사용하여 C++로 다시 돌아 가기 시작했으며, Visual Studio 2017 및 C++을 사용하여 간단한 바이너리 파일을 열어서 보는 MFC 프로그램을 만들려고합니다. 마법사가 작성한 코드 내에서 작업하려고하며 난처하게되었습니다. 나는 이것이 내가하고 싶은 일을하는 최선의 방법이 아니라는 것을 알고 있지만 나는 배우고있다. CArchive에서 참조하는 파일의 크기를 어떻게 얻을 수 있습니까?

은 어쨌든 내가 작업하고있는 코드는 다음과 같습니다 당신이 표준의 MFC 파일 열기 대화 상자 OnFileOpen을 사용하여 파일을 선택한 후

void CAdamImageManagerDoc::Serialize(CArchive& ar) 
{ 
    if (ar.IsStoring()) 
    { 
     // TODO: add storing code here 
    } 
    else 
    { 
     // TODO: add loading code here 
     char documentBuffer[1000]; 
     ar.Read(documentBuffer, 1000); 

     AfxMessageBox((LPCTSTR)documentBuffer); 
    } 
} 

이가 호출됩니다. 알아 내려고하는 것은 다음과 같습니다.

  1. 통화에서 참조 된 파일의 크기는 어떻게 알 수 있습니까?
  2. 참조 된 파일 이름이 무엇인지 어떻게 알 수 있습니까?

이것은 거의 10 년 동안 내 첫 번째 질문입니다. 친절하게 질문하고 올바른 질문이나 다른 것을 어떻게 형식화하지 않았는지 알려주지 마십시오.

+2

GetFile() 멤버가 도움이됩니다. –

답변

3
  • 사용 ar.GetFile()->GetFilePath()은 파일 크기를 얻을 수있는 파일 (reference)
  • 사용 ar.GetFile()->GetLength()의 전체 파일 경로를 얻을 수 있습니다. (reference)
2

일반적으로 CArchive의 스트림을 역순으로 디코딩합니다.

따라서 대부분의 경우 파일 크기를 알 필요가 없습니다. n 요소를 직렬화하는 작업은 대부분 CObList 또는 CObArray을 사용하거나 아카이브에 데이터 블록의 크기와 BYTE를 쓰면됩니다. 스트림을 디코딩 할 수있는 것과 같은 방법입니다.

if (ar.IsStoring()) 
{ 
    DWORD dwSize = m_lenData; 
    ar << dwSize; 
    ar.Write(documentBuffer, dwSize); 
} 
else 
{ 
    DWORD dwSize; 
    ar >> dwSize; 
    ar.Read(documentBuffer, dwSize); 
} 

CString이 직렬화 또는 CObArray 직렬화하는 방법을 같은 방법을 찾을 방법은 MFC 코드를 보면.

이 경우 파일은 이진 파일이됩니다. 더 이상 단순한 "텍스트"가 아닙니다.