Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 1
Регистрация: 28.03.2014
Сообщений: 36

Запись вектора структур в файл, fstream

25.11.2014, 00:58. Показов 2655. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вроде бы простая задача, а справиться не могу :/
Есть обычная структура:

C++
1
2
3
4
5
6
7
8
9
10
11
12
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];
};
Есть вектор этих структур:

C++
1
std::vector<Person> list;
Их нужно записать в файл. Иду следующим путём:
Вариант 1 (цикл):

C++
1
2
3
4
5
6
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();
Вариант 2 (попытка записать целым куском):

C++
1
2
3
[code]
  file.write((wchar_t*)&list, sizeof(Person)*list.size());
[/code]
В итоге и в первом и во втором случае на выходе получаю пустой файл. :/ В чем дело не могу сообразить...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.11.2014, 00:58
Ответы с готовыми решениями:

Запись и чтение вектора структур в бинарный файл
Есть заполненный вектор структур. Структура вида: struct struc { string a; int x; map&lt;int, int&gt;m; }; Написал две...

Запись и чтение вектора структур в бинарный файл(2)
Есть заполненный вектор структур. Структура вида: struct struc { string a; int x; map&lt;int, int&gt;m; }; ...

Запись/чтение структур (файлы) + разница между FILE * и <fstream>
Всем привет. Порыскал по форуму, погуглил... Решения есть, но они не ясны (что, почему да как) и не все работают. Однако, я так и не нашёл...

8
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
25.11.2014, 05:16
Лучший ответ Сообщение было отмечено Faltfromoss как решение

Решение

Так надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    struct Person pr;
    std::vector<Person> list;
 
    lstrcpy(pr.adress, L"1111111111"); 
    lstrcpy(pr.birthDay, L"2222222222");
    lstrcpy(pr.homePhone, L"3333333333");
    lstrcpy(pr.mobilePhone, L"4444444444");
    lstrcpy(pr.name, L"5555555555");
    list.push_back(pr);
 
    lstrcpy(pr.adress, L"6666666666"); 
    lstrcpy(pr.birthDay, L"7777777777");
    lstrcpy(pr.homePhone, L"88888888888");
    lstrcpy(pr.mobilePhone, L"99999999999");
    lstrcpy(pr.name, L"00000000000");
    list.push_back(pr);
 
 
 
    std::ofstream file("D:\\output.txt", std::ofstream::binary);
 
    file.write((char *)&list[0], sizeof(Person) * list.size()); 
    file.close();
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
25.11.2014, 05:38
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
    std::vector<Person> list;
 
    for (int i=0; i<100; i++)
    {
        Person item;
        memset((void *)&item, 0, sizeof(item));
        swprintf(item.name,L"name %d",i);
        swprintf(item.surname,L"surname %d",i);
        list.push_back(item);
    }   
 
    std::wfstream file("test.dat", std::ios::binary | std::ios::out);
 
    for (int i = 0; i < list.size(); i++)
        {
            file.write((wchar_t *)&list.at(i), sizeof(Person));
        }
    
    file.close();
    list.clear();
    return 0;
}
Добавлено через 14 минут
Точнее:
C++
1
2
3
4
5
6
    std::fstream file("test.dat", std::ios::binary | std::ios::out);
 
    for (int i = 0; i < list.size(); i++)
        {
            file.write((char *)&list.at(i), sizeof(Person));
        }
0
0 / 0 / 1
Регистрация: 28.03.2014
Сообщений: 36
25.11.2014, 05:52  [ТС]
demmax2004, да, я не отметил, что структура у меня заполняется пользователем. Заполняется корректно, проверял отладчиком:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void AddEntry(HWND hWnd)
{
    Person temp;
    wchar_t buf[1000];
    GetDlgItemText(hWnd, IDC_EDIT_NAME, buf, nMaxLength);
    wcscpy(temp.name, buf);
    GetDlgItemText(hWnd, IDC_EDIT_SURNAME, buf, nMaxLength);
    wcscpy(temp.surname, buf);
    GetDlgItemText(hWnd, IDC_EDIT_FATHER, buf, nMaxLength);
    wcscpy(temp.patronymic, buf);
    GetDlgItemText(hWnd, IDC_EDIT_HOMEPHONE, buf, nMaxLength);
    wcscpy(temp.homePhone, buf);
    GetDlgItemText(hWnd, IDC_EDIT_MOBILEPHONE, buf, nMaxLength);
    wcscpy(temp.mobilePhone, buf);
    GetDlgItemText(hWnd, IDC_EDIT_BIRTHDAY, buf, nMaxLength);
    wcscpy(temp.birthDay, buf);
    GetDlgItemText(hWnd, IDC_EDIT_TOWN, buf, nMaxLength);
    wcscpy(temp.town, buf);
    GetDlgItemText(hWnd, IDC_EDIT_ADRESS, buf, nMaxLength);
    wcscpy(temp.adress, buf);
    GetDlgItemText(hWnd, IDC_NOTE, buf, 300);
    wcscpy(temp.note, buf);
    list.push_back(temp);
}
Путь к файлу выбирал диалоговым окном с помощью функции GetSaveFileName:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
    }   
}
Я уже грешу может быть на кривой набор флагов при открытии на сохранении, хотя не вижу ничего лишнего :/
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
25.11.2014, 05:57
Цитата Сообщение от Faltfromoss Посмотреть сообщение
Я уже грешу может быть на кривой набор флагов при открытии на сохранении, хотя не вижу ничего лишнего
Я же написал как нужно записывать, причем компилировал и проверял что пишется корректно. Не работает чтоли?
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
25.11.2014, 06:02
Цитата Сообщение от Faltfromoss Посмотреть сообщение
Да, я не отметил, что структура у меня заполняется пользователем.
Да какая нахрен разница кем и чем заполняется, я тебе дал 100% рабочий код.
1
0 / 0 / 1
Регистрация: 28.03.2014
Сообщений: 36
26.11.2014, 00:50  [ТС]
Цитата Сообщение от demmax2004 Посмотреть сообщение
Да какая нахрен разница кем и чем заполняется, я тебе дал 100% рабочий код.
Да, точно, всё получилось. Я думал изначально что раз структура состоит из unicode строк, то и поток нужен соответствующий. Дико ошибался...

Благодарю за подсказку

Добавлено через 3 часа 54 минуты
Подскажите как теперь этот вектор структур вывести в окно посредством WinAPI? То есть чтобы была своего рода база данных в виде таблицы с полями и записями. И чтоб каждая запись была интерактивная.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
26.11.2014, 04:53
Что значит интерактивная ?
0
0 / 0 / 1
Регистрация: 28.03.2014
Сообщений: 36
26.11.2014, 14:58  [ТС]
Цитата Сообщение от demmax2004 Посмотреть сообщение
Что значит интерактивная ?
Ну в смысле есть возможность выбирать запись, при двойном клике открывается диалоговое окно...
В общем ListView сейчас разгребаю...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2014, 14:58
Помогаю со студенческими работами здесь

Запись в файл fstream
Вот такой вот код , изобразил я для записи переменной в файл , проблема в том , что компилятор записывает в него не 10 раз L , а ...

Запись в файл fstream
После первого прогона не выводит ничего из файла. void WriteInTheFile(fstream &amp;file_in) { file_in.seekg(0,file_in.end); char str;...

Запись структур в файл
У меня есть файл и масив структур. Надо реализовать запись и чтения файла. Можна ли сделать так: запускаю первый раз програму, ввожу дание...

Запись структур в файл
можно ли сделать так что бы структуру base, которую нужно записать несколько раз в файл а потом считать, без константы MAX и без ее...

Запись структур в файл
Доброго всем времени суток.:dance: Обращаюсь к вам с таким вопросом : Взяв за основу Задача 2 Лабораторной работы изменить код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru