2016-12-21 21 views
0

私の要件は、人間が理解できない.datまたは.binファイルに文字列データを格納することです。私はcstringデータをバイナリに保存したい(テキストモードではなく、アンアンランスル)。しかし、それを保存することはできない。

バイナリモードでファイルに整数を格納できますが、バイナリモードでは文字列を格納できません。私はfstreamの を使用してみましたMFC でのCFileとCArchiveを使用してみました

は *ファイルを使用して試みたが、成功しませんでした。

誰でも私にこれを手伝ってもらえますか?

void CAuthenticationFileDlg::OnBnClickedButton1() 
{ 
    // TODO: Add your control notification handler code here 
    UpdateData(TRUE); 
    static int count =0; 
    DisplayKeys(count); 

    CString strTotalKeys = m_keys->GetKey1() + m_keys->GetKey2() + m_keys-getkey3() + m_keys->GetKey4(); 
    m_vectKeys.push_back(strTotalKeys); 

    m_EditKey1.SetFocus(); 
    CFile pFile; 
    ASSERT (pFile != NULL); 
    if (!pFile.Open (_T("foo.dat"), CFile::modeReadWrite | CFile::modeCreate|CFile::typeBinary)) 
    { // Handle error 
     return; 
    } 
    CArchive arStore(&pFile, CArchive::store); 
    Serialize(arStore); 

    delete m_keys; 
    count++; 

    if(count>0) 
    { 
     m_keys = new CKeys; 
    } 

    UpdateData(FALSE); 
} 

私は4つのCstring変数を持つCkeysというクラスを持っています。 オブジェクトを格納しようとしています。 とにかくOKです。データをバイナリ形式で保存したい。

上記は、ダイアログが表示される前に請求されるMFC CDialog仮想関数であるOnintDialog()を示しました。ファイルを読み込んでリストコントロールに表示しようとしています。 (私はこれを達成できませんでした) in Buttonイベント私はユーザーによって与えられたオブジェクトデータを書き込もうとしています。

+1

それはここに立っているようので、あなたが本当にあなたの質問を再考/言い替えるする必要がありますされ、あなたが望むものは全く不明です。 –

+0

バイナリデータを保存/復元するために、CArchiveの読み取り/書き込みメソッドを使用します。詳細については、[ここ](https://msdn.microsoft.com/en-us/library/caz3zy5s.aspx#carchive__writeオブジェクト)を参照してください。 – Jackdaw

答えて

0
  1. 文字列を変換不可能な形式に変換/エンコードする方法を使用します。
  2. 以下のメソッドがファイルへ/からのCString値を保存/復元することができます:

void WriteString(CString file, CString s) 
{ 
    CFile myFile(file, CFile::modeCreate | CFile::modeWrite); 
    CArchive ar(&myFile, CArchive::store);   
    int sz = s.GetLength(); 
    ar << sz; // ar.Write(&sz, sizeof(int)); 
    ar.Write(s.GetBuffer(), sz);  
    ar.Close(); 
} 

CString ReadString(CString file) 
{ 
    CString s; 
    CFile myFile(file, CFile::modeRead); 
    CArchive ar(&myFile, CArchive::load);   
    int sz = 0; 
    ar >> sz; // ar.Read(&sz, sizeof(int)); 
    char* p = s.GetBuffer(sz); 
    ar.Read(p, sz);  
    s.ReleaseBuffer(sz);  
    p = nullptr; // avoid using released buffer 
    ar.Close(); 
    return s; 
} 
+0

1.このコードはどのようにエンコード/デコードするのですか? 2. 'ReadString'と' WriteString'は単一の 'CString'をファイルに読み書きしますが、あまり役に立ちません。 3. NULの文字列ターミネータが 'ReadString'で正しく処理されているかどうかはよく分かりませんが、結局は正しいかどうかはチェックしませんでした。 –

+0

通常、シリアル化サポートを使用する場合は、 'CArchive'を構築します。あなたのコードはそれを使用せず、明白な理由もありません。あなたは 'CFile'オブジェクトを通じて簡単に利用できなかったものを使用していません。また、ゼロターミネータをストリーミングしないので、[ReleaseBuffer](https://msdn.microsoft.com/en-us/library/sddk80xf.aspx#csimplestringt__releasebuffer)の呼び出しはバグです。明示的に長さを渡す必要があります。 – IInspectable

関連する問題