С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для VanyakaCompany
4 / 3 / 3
Регистрация: 15.07.2014
Сообщений: 77

Запись вектора классов в файл через WriteFile

03.03.2017, 21:27. Показов 1509. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется класс:
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
class pages
{
public:
    QString modelName;      // Название модели
    QString type;           // Тип
    double volume;          // Объем двигателя
    int capacity;           // Вместимость
    int tonnage;            // Грузоподъемность
    int speed;              // Максимальная скорость
    double acceleration;    // Разгон до 100 км/ч
    bool control;           // Наличие системы климат - контроля
    int number;             // Количество
    int price;              // Цена
    QDate date;             // Дата последнего завоза
 
    pages();    // Конструктор
 
    bool operator!= (const pages &page) const;      // Оператор !=
    bool operator== (const pages &page) const;      // Оператор ==  
    bool operator> (const pages &page) const;       // Оператор >
    bool operator>= (const pages &page) const;      // Оператор >=
    bool operator< (const pages &page) const;       // Оператор <
    bool operator<= (const pages &page) const;      // Оператор <=
};
Имеется вектор:
C++
1
QVector <pages> pageMas;
Нужно через WriteFile записать содержимое вектора в файл.

Можно ли записать сразу элемент вектора? Т.е. pageMas[i]
Или же обязательно записывать каждый параметр класса отдельно? pageMas[i].modelName, pageMas[i].type и т.д.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2017, 21:27
Ответы с готовыми решениями:

Запись в файл различных типов данных через WriteFile
Имеется диалоговое окно с размещенными на нем элементами edit, в которые записаны данные разных форматов (byte, long, int32, int64, word,...

Запись в файл строк с WriteFile(.)
Привет всем! Пишу проектик.Возникает некая проблемка с записью строк в файл. вот код: #include &lt;iostream&gt; #include...

Запись структуры в файл, WriteFile возвращает false
Имеестя структура, которую необходимо записать в файл. При попытке записи WriteFile возвращает false. Привожу код: struct bd { ...

9
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
03.03.2017, 21:33
VanyakaCompany, т.к. вы используете Qt, то лучше взгляните в сторону QDataStream. Или вам обязатльно WinAPI использовать?
0
 Аватар для VanyakaCompany
4 / 3 / 3
Регистрация: 15.07.2014
Сообщений: 77
03.03.2017, 21:35  [ТС]
Нужно использовать именно WinAPI
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
03.03.2017, 21:46
VanyakaCompany, WinAPI нужно использовать для записи в файл, я вас верно понял?
А доступ к QDataStream у Вас есть?
0
 Аватар для VanyakaCompany
4 / 3 / 3
Регистрация: 15.07.2014
Сообщений: 77
03.03.2017, 21:48  [ТС]
Нужно организовать некую "базу данных", т.е. содержимое вектора должно записываться в отдельный файл и считываться из него
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
03.03.2017, 22:01
VanyakaCompany, если можно использовать классы Qt, то:

добавляем в класс pages:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    template<class T>
    friend T& operator <<(T &stream, const pages &p) {
        stream << p.modelName << p.type << p.volume
               << p.capacity << p.tonnage << p.speed
               << p.acceleration << p.control << p.number
               << p.price << p.date;
        return stream;
    }
 
    template<class T>
    friend T& operator >>(T &stream, pages &p) {
        stream >> p.modelName >> p.type >> p.volume
               >> p.capacity >> p.tonnage >> p.speed
               >> p.acceleration >> p.control >> p.number
               >> p.price >> p.date;
        return stream;
    }
пример использования:
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
30
    // сериализуем вектор классов pages
    QByteArray arr;
    {
        // сформируем вектор из 10 классов
        QVector<pages> pgs;
        for (int i = 0; i < 10; ++i) {
            pages p;
            p.modelName = QString("Model%1").arg(i);
            p.type = "Type";
            pgs.append(p);
        }
        QDataStream stream(&arr, QIODevice::WriteOnly);
        // запишем его
        stream << pgs;
        qDebug() << arr.toHex();
    }
    
    // здесь можно записывать в файл, используя WriteFile
    // arr.data() - указатель на байты 
    // arr.size() - количество байт
 
    // читаем вектор классов pages из массива байт
    {
        QDataStream stream(&arr, QIODevice::ReadOnly);
        QVector<pages> pgs2;
        stream >> pgs2;
        foreach (const pages & p, pgs2) {
            qDebug() << p.modelName;
        }
    }
1
 Аватар для VanyakaCompany
4 / 3 / 3
Регистрация: 15.07.2014
Сообщений: 77
03.03.2017, 22:18  [ТС]
Хорошо, общую идею я понял, но у меня ещё один вопрос.

При записи Qstring в файл записывается какая-то абракадабра. Решил перед записью переводить Qstring в обычную строку, но не могу понять как это сделать. Всякие toLatin не помогают, toAscii отсутствует. Как это вообще делается?
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
03.03.2017, 22:33
Цитата Сообщение от VanyakaCompany Посмотреть сообщение
При записи Qstring в файл записывается какая-то абракадабра
В QString текст хранится в кодировке UTF-16. Как вы записываете? Текст кириллический?
0
 Аватар для VanyakaCompany
4 / 3 / 3
Регистрация: 15.07.2014
Сообщений: 77
03.03.2017, 22:37  [ТС]
Изначально пытался с этим работать:
C++
1
2
3
4
5
6
7
void unlimitedWarehouse::add(int i) {
    char buf[1000];
 
    sprintf(buf, "\n%s\n%s\n%f\n%d\n%d\n%d\n%f\n%d\n%d\n%d\n%s", pageMas[i].modelName, pageMas[i].type, pageMas[i].volume, pageMas[i].capacity, pageMas[i].tonnage, pageMas[i].speed, pageMas[i].acceleration, pageMas[i].control, pageMas[i].number, pageMas[i].price, pageMas[i].date.toString("dd/MM/yy"));
 
    WriteFile(fileHandle, buf, sizeof(char) * strlen(buf), &dwBytesWritten, NULL);
}
Текст на английском.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
03.03.2017, 23:06
Лучший ответ Сообщение было отмечено VanyakaCompany как решение

Решение

Цитата Сообщение от VanyakaCompany Посмотреть сообщение
pageMas[i].modelName
Так нельзя обращаться к QString строке, т.к. формат %s предназначен для char* строк, а в QString указатель на данные строки член этого класса. Если нужно получить указатель на строку ввиде char*, то воспользуйтесь функцией QChar * QString::data()

PS: но самый переносимый способ воспользоваться QDataStream, как в моем предыдущем сообщении.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2017, 23:06
Помогаю со студенческими работами здесь

WriteFile, символы записываются в файл через пробел
ipnamefile = CreateFile(TEXT(&quot;C://Program Files//text.txt&quot;), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, ...

Записать программным путем команды в bat файл через writefile
Как записать программыным путем команды в bat-файл через writefile?

Запись вектора в файл
Здравствуйте в одной функции записываю вектор Объявил QVector&lt;souble&gt; vec; Записываю в вектор: vec.push_back(k+m); В другой...

Запись в файл вектора
можете подсказать как записать вектор структур в файл например есть vector&lt;game&gt;gamelist game это структура с полями int data; ...

Запись вектора в файл
Доброго времени суток! Есть структура: struct Clinic { string FIO; char sex; int age; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru