2016-12-21 5 views
0

Мое требование - хранить данные строки в файле .dat или .bin, который человек не может понять.Я хочу хранить данные cstring в двоичном формате (не в текстовом режиме, но не понимая), но не в состоянии его сохранить

Я могу хранить целые числа в файле в двоичном режиме, но не в состоянии хранить строку в двоичном режиме.

Я попытался с помощью CFile и CArchive в MFC попытался с помощью fstream Пробовал с помощью файла * Но не мог удалось.

Может ли кто-нибудь помочь мне в этом?

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); 
} 

У меня есть класс Ckeys, который имеет 4 переменные Cstring. Я пытаюсь сохранить его объект. В любом случае, я в порядке. Я хочу хранить данные в двоичном формате.

Выше я упомянул OnintDialog(), который является виртуальной функцией MFC CDialog, которая отображается перед диалоговым окном. В котором я пытаюсь прочитать файл и отобразить его в элементе управления списком. (Я не смог этого добиться) в событии Button Я пытаюсь записать данные объектов, которые даются пользователем.

+1

Вам действительно нужно перефразировать/пересмотреть свой вопрос, потому что, как он стоит здесь совершенно непонятно, что вы хотите , –

+0

Просто используйте методы чтения/записи CArchive для сохранения/восстановления двоичных данных. Подробную информацию см. В [здесь] (https://msdn.microsoft.com/en-us/library/caz3zy5s.aspx#carchive__writeobject). – 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