1 Востаннє редагувалося Faltfromoss (24.11.2014 23:58:01)

Тема: Запис в файл, fstream

Добрий вечір. В мене, на мій погляд, просте завдання, але я не можу його подолати :/

Є звичайна структура:

struct Person
{
    wchar_t name [50];
    wchar_t surname [50];
    wchar_t patronymic[50];
    wchar_t homePhone[20];
    wchar_t mobilePhone[20];
    wchar_t birthDay[50];
    wchar_t town[50];
    wchar_t adress[100];
    wchar_t note[300];
};

Є масив цих структур, який заповнюється користувачем:

std::vector<Person> list;

У векторі структури заповнюються коректно, питань нема. Завдання полягає в тому, щоб записати цей масив структур в файл. Я йду таким шляхом:
Варіант перший за допомогою циклу:

  std::wfstream file(path, std::ios::binary | std::ios::out);
        for (int i = 0; i < list.size(); i++)
    {
        file.write((wchar_t*)&list[i], sizeof(list[i]));
    }
  file.close();

Варіант другий - спроба записати цілим шматком:

  file.write((wchar_t*)&list, sizeof(Person)*list.size());

І на виході в обох випадках отримую абсолютно пустий файл. Підкажіть шо не так, бо вже замучився шукати помилку

2

Re: Запис в файл, fstream

Другий спосіб можете одразу викинути, list - не масив, а вектор, тобто за адресою &list можна знайти хіба що посилання на реальний масив (хоча деякі компілятори і визначають std::vector::operator& як посилання на вміст, розраховувати на це не варто).
І спробуйте записувати sizeof(Person) байтів за раз.
Хоча схоже, що проблема деінде.

3

Re: Запис в файл, fstream

koala написав:

Другий спосіб можете одразу викинути, list - не масив, а вектор, тобто за адресою &list можна знайти хіба що посилання на реальний масив (хоча деякі компілятори і визначають std::vector::operator& як посилання на вміст, розраховувати на це не варто).
І спробуйте записувати sizeof(Person) байтів за раз.
Хоча схоже, що проблема деінде.

sizeof(Person) байтів теж пробував, результат той же. Шлях до файлу вибирається через діалогове вікно відкриття файлів:

BOOL OpenFileDlg(HWND hWnd, LPWSTR buf, INT id)
{
    OPENFILENAME ofn = { sizeof(OPENFILENAME) };
    ofn.hInstance = GetModuleHandle(NULL);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFilter = L"All Files\0*.*\0Текстовые файлы\0*.txt\0\0";
    ofn.nFilterIndex = 2;
    ofn.lpstrDefExt = L".txt";
    ofn.nMaxFile = _MAX_PATH;
    ofn.lpstrFile = buf;
    switch (id)
    {
    case ID_FILE_SAVE :
        ofn.lpstrTitle = L"Сохранить файл";
        ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR |
            OFN_NOREADONLYRETURN | OFN_OVERWRITEPROMPT;
        if (GetSaveFileName(&ofn))
                return TRUE;
            return FALSE;
    case ID_FILE_OPEN :    
        ofn.lpstrTitle = L"Открыть файл";
        ofn.Flags = OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_READONLY | OFN_SHOWHELP;
        if (GetOpenFileName(&ofn))
                return TRUE;
            return FALSE;
    default:
        break;
    }    
}

Я вже грішу може на кривий набір флагів на відкриття файлу для збереження, але так дивлюся, нічого зайвого начебто нема   %)

4

Re: Запис в файл, fstream

Крім того, sizeof( wchar_t ) != 1, але це призвело б до сміття в файлі, а не пустого.
Покажіть, що там навколо збереження файла відбувається.

5

Re: Запис в файл, fstream

koala написав:

Крім того, sizeof( wchar_t ) != 1, але це призвело б до сміття в файлі, а не пустого.
Покажіть, що там навколо збереження файла відбувається.

Мені тут підказали, що взагалі без різниці чим заповнена структура і її записувати треба за допомогою звичайного потоку:

std::ofstream file(path, std::ofstream::binary);
file.write((char*)&list[0], sizeof(Person)*list.size())
file.close();

А я спочатку помилково думав, що якщо структура заповнена unicode стрічками, то і потік для запису в файл треба обирати відоповідний. І дуже помилявся.

6

Re: Запис в файл, fstream

Із записом та зчитуванням із файлу розібрався. Підкажіть тепер як можна організувати вивід цього вектору структур у вікно у вигляді списку і щоб кожен запис був інтерактивний? Тобто своєрідна база даних. Якими хоч функціями користуватись?