Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
1

Выбор для xml парсинга

20.01.2015, 17:05. Просмотров 1491. Ответов 24
Метки нет (Все метки)

Приветствую всех.
Помогите пожалуйста советом, что лучше взять для парса xml файла.
Что есть у меня:
- файлы могут быть как очень маленькими (10-50 строк) так и очень большими (100-200 тысяч строк)
- мне надо только парсить (читать и разбирать) документы, никаких изменений и добавлений
- данные из файла надо сразу разбирать в массив-структуру массивов чтобы потом использовать нужные части в программе
- я знаю все возможные теги\дерево тегов которое будет использоваться в том или ином xml файле

1. QXmlSimpleReader - судя по описанию не очень подходит, брать по кускам, читать только текущий тег и ничего не знать о ранних вызовах
2. QXmlStreamReader - быстрый, что является плюсом в разборе более 100 тысяч строк, но не знает ничего об иерархии документа, но иерархию знаю я(можно ли это как то использовать?)
3. QDomDocument - выглядит очень привлекательно, тк видит все дерево сразу и я могу найти нужный мне тег и параметр моментально, но начинает жрать память. На сколько это критично на слабых компах и при разборе огромного файла?
4. забить на Qt и тащить boost и просто ползать по строкам (но опять таки, маленький файл ерунда, большой - проблема)

Что лучше использовать, или на что обратить внимание, на что опираться при выборе? Пока на вскидку только 2 и 3 варианты. Как обстоят дела с похожими вложенными тегами?

Например:

XML
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<maintree>
    <childs>
        <first_tr>
            <childs>
                <object1>
                    <name>"Стол обеденный"</name>
                    <size>"205x45x98"</size>
                    <options>"Продажа"</options>
                </object1>  
                <object2>
                    <name>"Стол компьютерный"</name>
                    <size>"150x58x100"</size>
                    <options>"Покупка"</options>
                </object2>  
                <objectN>
                    <name>"Стол журнальный"</name>
                    <size>"85x35x50"</size>
                    <options>"Продажа"</options>
                </objectN>  
            </childs>
        <options>
        <about>"First"</about>
        <size>"562"</size>
        </options>
        </first_tr>
        <second_tr>
            <childs>
                <object1>
                    <name>"Стул офисный"</name>
                    <size>"30x45x95"</size>
                    <options>"Покупка"</options>
                </object1>  
                <objectN>
                    <name>"Стул компьютерный"</name>
                    <size>"45x45x60"</size>
                    <options>"Продажа"</options>
                </objectN>  
            </childs>
        <options>
        <about>"Second"</about>
        <size>"41"</size>
        </options>
        </second_tr>
    </childs>
    <options>
        <size>"N"</size>
        <about>"Ассортимент"</about>
        <informations>"Покупка-продажа"</informations>
    </options>
    <other>
        <version>"Ver. 2.1.3"</version>
    </other>
</maintree>
childs, options встречаются не раз в разных вложениях.
К примеру QXmlStreamReader может как то "понять" что в одном случае тег относится к одному вложению, а потом к другому?

заранее спасибо за любые ответы!

Добавлено через 20 минут
PS. как вариант просто использовать QString и идти по шагам, но это на сколько огромный шаблон придется писать тех же switch-case-ов чтобы разобрать файл, хотя бы один.

Добавлено через 4 минуты
PPS. или вообще забить на Qtшные средства и использовать что-то из чистого С++?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2015, 17:05
Ответы с готовыми решениями:

Класс парсинга xml
Нужно реализовать метод класса, который ищет нужный элемент, имя которого передается методу извне....

QT - класс для парсинга сайтов
Здравствуйте! Я совсем недавно начал изучать QT. Раньше изучал только С++. Сейчас стоит задача...

Библиотека для xml парсинга
Доброго времени суток. У меня появилась необходимость чтения xml из потока (файлы будут...

Посоветуйте библиотеку для парсинга XML (xdxf)
Здравствуйте. Есть словари в формате xdxf. Кто не знаком xdxf - это, как по мне, сильно неудачная...

Математические алгоритмы для парсинга текста из word и xml
Здравствуйте, какие есть математические алгоритмы для парсинга текста из word или xml или похожих....

24
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
20.01.2015, 19:58 2
Цитата Сообщение от Sph Посмотреть сообщение
мне надо только парсить (читать и разбирать) документы, никаких изменений и добавлений
QXmlStreamReader
1
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
21.01.2015, 09:30  [ТС] 3
Цитата Сообщение от RazrFalcon Посмотреть сообщение
QXmlStreamReader
Спасибо, вопрос тогда такой. Т.к. QXmlStreamReader ничего не знает о предыдущих узлах, поулчается структура его такая
"пока не конец файла и не ошибка" запускается цикл, и в цикле(судя по примерам) идет большое количество if-ов(есл тег такой-то то делаем то-то).
Имеется ли какя-то возможность построить заранее модель и ее использовать или что-то для упрощения парса, потому что я конечно знаю все иерархию дерева, и возможные вложенные теги, но их может быть крайне много. Или только как есть, вручную по имеющемуся шаблону древа я и буду создавать цикл и никак иначе?

Добавлено через 4 минуты
вот есть кусок примера из сети
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while (!xmlDoc.atEnd() && !xmlDoc.hasError()) {
    QXmlStreamReader::TokenType token = xmlDoc.readNext();
    if (token == QXmlStreamReader::StartElement) {
      if (xmlDoc.name() == "Record") {
        QXmlStreamAttributes attrib = xmlDoc.attributes();
        date = QDate::fromString(attrib.value("Date").toString(), "dd.MM.yyyy");
      }
 
      if (xmlDoc.name() == "Value") {
        valRate = german.toDouble(xmlDoc.readElementText());
        continue;
      }
    }
    if (token == QXmlStreamReader::EndElement && xmlDoc.name() == "Record")
      emit rate(date, valRate);
  }
Как я вижу я спокойно захожу в if (по нужному тегу) и могу добавлять данные между тегами в нужный мне массив или структуру массивов или еще куда.
Но:
- ифов может быть очень много
- что делать с вложенными тегами и похожими тегами(один и тот же тег но в разной иерархии)
(пока не совсем ясно, если я все проверяю по шагово, это на сколько огромные должны быть проверки)
Заранее спасибо за любые ответы!
0
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
21.01.2015, 10:27 4
Цитата Сообщение от Sph Посмотреть сообщение
Как я вижу я спокойно захожу в if (по нужному тегу) и могу добавлять данные между тегами в нужный мне массив или структуру массивов или еще куда.
Но:
- ифов может быть очень много
- что делать с вложенными тегами и похожими тегами(один и тот же тег но в разной иерархии)
(пока не совсем ясно, если я все проверяю по шагово, это на сколько огромные должны быть проверки)
Заранее спасибо за любые ответы!
Хороший пример программы XmlStreamReader есть в главе 16 в книге "Жасмин Бланшет, Марк Саммерфилд - Qt 4 Программирование GUI на С++". Там также есть примеры других классов для работы с XML.
1
21.01.2015, 10:27
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 11:30  [ТС] 5
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Хороший пример программы XmlStreamReader есть в главе 16 в книге "Жасмин Бланшет, Марк Саммерфилд - Qt 4 Программирование GUI на С++". Там также есть примеры других классов для работы с XML.
Действительно, пример очень хороший там, я забыл совсем про эту книгу. Под рукой в основном Шлее лежит.

Созрел только вопрос, можно ли использовать XmlStreamReader не прибегая к QFile для открытия файла?
Просто во всем проекте использую стандартные способы работы с файлами fopen\fread\fwrite и не хотелось бы отходить от этого.
При использовании QFile все работает прекрасно.(мини код)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
QFile fff("tt.xml");
fff.open(QIODevice::ReadOnly);
QXmlStreamReader xml_reader(&fff);
while(!xml_reader.atEnd())
{
    if(xml_reader.isStartElement())
    {
        QStringList stl;
        stl << xml_reader.name().toString();
        qDebug() << stl;
    }
 
    xml_reader.readNext();
}
А если пробую через обычное открытие файла, то не реагирует. Подскажите пожалуйста как правильно написать.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FILE *xml_file;
if((xml_file = fopen("tt.xml", "rt")) != NULL)
{
    qDebug() << "yes open!";
}
QXmlStreamReader xml_reader((const char*)xml_file); //тут не верно точно, тк не работает
//так ругается QXmlStreamReader xml_reader(xml_file);
//и так тоже QXmlStreamReader xml_reader(&xml_file);
//так пофиг QXmlStreamReader xml_reader("tt.xml");
//туплю и не понимаю как написать правильно =(
while(!xml_reader.atEnd())
{
    if(xml_reader.isStartElement())
    {
        QStringList stl;
        stl << xml_reader.name().toString();
        qDebug() << stl;
    }
 
    xml_reader.readNext();
}
0
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.01.2015, 12:49 6
Цитата Сообщение от Sph Посмотреть сообщение
Просто во всем проекте использую стандартные способы работы с файлами
Зачем смешивать код?
0
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 14:04  [ТС] 7
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Зачем смешивать код?
Так я и не хочу этого делать потому и спрашиваю. Во всем проекте работаю через стандартные fopen\fread\fwrite и впихивать внезапно QFile желания нет.
0
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.01.2015, 14:12 8
Цитата Сообщение от Sph Посмотреть сообщение
Так я и не хочу этого делать
Вы уже делаете. Зачем использовать fopen вместо QFile? Себе же во вред работаете.
0
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 14:18  [ТС] 9
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Вы уже делаете. Зачем использовать fopen вместо QFile? Себе же во вред работаете.
За тем что я пишу на с++, который НЕ меняется в отличии от классов и модулей кути. Загрузите старый проект с чисто кутишными функциями и классами годовой давности и при компиляции будет сотня ошибок, потому что что-то изменили, что-то убрали, что то добавили. чисто сишные же вещи остаются неизменными уже долго.
Это как вместо QByteArray можно использовать обычный char и получать тот же результат без подводных камней.
Чем меньше чисто кутишных приблуд использовать тем меньше проблем я обрету при выходе новой версии кути(имхо). Готовое использовать здорово, но лучше все контролировать самому.
0
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.01.2015, 14:25 10
Цитата Сообщение от Sph Посмотреть сообщение
Загрузите старый проект с чисто кутишными функциями и классами годовой давности и при компиляции будет сотня ошибок
Че за бред?..

Цитата Сообщение от Sph Посмотреть сообщение
Это как вместо QByteArray можно использовать обычный char и получать тот же результат без подводных камней.
Только при условии что вы знаете все подводные камни char.

Если вам так противен Qt - не используйте его. Какие проблемы?

Цитата Сообщение от Sph Посмотреть сообщение
тем меньше проблем я обрету при выходе новой версии кути
Совместимость была слегка сломана при переходе с Qt 4 на Qt 5. Дока по портированию на пару страниц всего. Если вы писали проект на Qt 4 и открыли его через 100 лет в новой версии Qt 4 - то ничего не сломается. Потому что есть обратная совместимость между мажорными релизами. А если вы не в курсе что мажорные версии могут иметь различный функционал - то тут ничего не поделаешь...

И не будем забывать что реализация стандартной библиотеки C++ может отличатся на разных платформах. По этому при портировании вы огребете проблем по полной. А с Qt - 0, так как в этом и состоит его задача.

Цитата Сообщение от Sph Посмотреть сообщение
Готовое использовать здорово, но лучше все контролировать самому.
Для 10-и строчных проектов - да.
0
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 14:50  [ТС] 11
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Если вам так противен Qt - не используйте его. Какие проблемы?
С чего Вы взяли что мне противен Qt?
Я новичок в этой теме и лишь высказываю то с чем сталкивался. Если Вам так хочется поплеваться на тех кто каким-то образом против Qt идите дальше. Смысл быть таким резким.

Qt кроссплатформенный инструментарий разработки ПО на языке программирования C++(c)
Это так или описание врет?
Почему я не могу использовать функционал чистого кути только там где мне это надо, а в остальном пользоваться сишными вещами?(спрашиваю без подъебов и прочего, мне правда интересно. Не находил информацибю, что при использовании чистого си я мешаю что-то.)
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Че за бред?..
Если Вы с таким не сталкивались не значит что этого не бывает.
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Совместимость была слегка сломана при переходе с Qt 4 на Qt 5.
У меня был 4.8 и примеры с книги Шлее (Qt 4.8. Профессиональное программирование на C++) не запускались, приходилось в каждый проект что-то добавлять ручками. 1-2 строчки, но это раздражало.
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Дока по портированию на пару страниц всего
А потом еще и еще и еще добавится что-то. А если проект будет на несколько сотен тысяч строк везде бегать все изменять и что-то вспоминать где что на чем запускалось?

Добавлено через 2 минуты
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Только при условии что вы знаете все подводные камни char.
Я - нет, а вот коллеги знают и можно спросить совета.
Цитата Сообщение от RazrFalcon Посмотреть сообщение
И не будем забывать что реализация стандартной библиотеки C++ может отличатся на разных платформах.
Т.е. банальный fopen может быть воспринят по разному на разных платформах?
0
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.01.2015, 15:08 12
Цитата Сообщение от Sph Посмотреть сообщение
Почему я не могу использовать функционал чистого кути только там где мне это надо, а в остальном пользоваться сишными вещами?
Потому что это подойдет если вы пишите только под одну ОС. А вероятно и под одну архитектуру.

Цитата Сообщение от Sph Посмотреть сообщение
Смысл быть таким резким.
Где я был резким?

Цитата Сообщение от Sph Посмотреть сообщение
Если Вы с таким не сталкивались не значит что этого не бывает.
Я не сталкивался - потому что такой проблемы нет.[

quote="Sph;7136363"]У меня был 4.8 и примеры с книги Шлее[/quote]
В книгах всегда кривые примеры. Нужно использовать примеры которые идут вместе с Qt.

Цитата Сообщение от Sph Посмотреть сообщение
А потом еще и еще и еще добавится что-то.
Не раньше Qt 6. Так что у вас есть еще лет 5.

Цитата Сообщение от Sph Посмотреть сообщение
А если проект будет на несколько сотен тысяч строк везде бегать все изменять и что-то вспоминать где что на чем запускалось?
Почти все изменения синтаксические и решаются простой автозаменой. Если вы не помните "что на чем запускалось" - то это плохо документированный код, а не проблема Qt.

Цитата Сообщение от Sph Посмотреть сообщение
Т.е. банальный fopen может быть воспринят по разному на разных платформах?
Почему бы и нет?
0
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 15:51  [ТС] 13
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Потому что это подойдет если вы пишите только под одну ОС. А вероятно и под одну архитектуру.
А есть какое-то объяснение конкретное? Я не видел запрета или информации из разряда "ни в коем случае не используйте не кутишные либы\функции\классы(нужное подчеркнуть), иначе ваш проект не будет запускаться на других осях"
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Где я был резким?
>>Если вам так противен Qt - не используйте его. Какие проблемы?
=)
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Я не сталкивался - потому что такой проблемы нет.[
quote="Sph;7136363"]У меня был 4.8 и примеры с книги Шлее
В книгах всегда кривые примеры. Нужно использовать примеры которые идут вместе с Qt.[/quote]
Вам не кажется ЭТО уже странным. Если примеры из книжки не могу по каким либо причинам запуститься это уже НЕ правильно.
С Qt идут примеры уже под ту версию кути какая стоит у Вас.
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Не раньше Qt 6. Так что у вас есть еще лет 5.
А ну это все меняет! Подумаешь после меня придет кто-то и будет пытаться запустить мой проект написанный на 5й версией, а я буду сидеть дома и смеяться "вот дурачок, весь в 6 версии столько всего поменяли, а он пытается проект запустить который был собран столько лет назад".
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Почти все изменения синтаксические и решаются простой автозаменой. Если вы не помните "что на чем запускалось" - то это плохо документированный код, а не проблема Qt
т.е. Вы предлагаете делать так
- заходим на оф сайт
- ищем доку что где как поменялось
- открываем проект
- ищем все меняем
- закрываем сохраняем еще на НН-количество времени пока не придут новые изменения, а если у меня вдруг не будет интернета и доступа к ассистенсу и я буду сидеть с проектом который не запускается по какой либо причине это мои трудности, никто ж не виноват, что я поехал к клиенту чинить проект и не глянул какая новая версия кути и что в ней изменилось.
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Почему бы и нет?
Не знаю даже что ответить

Добавлено через 19 минут
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Не раньше Qt 6. Так что у вас есть еще лет 5.
Банально вспоминая QSerialPort упираемся в то, что проект статически не собирается. Измят это? Да скорее всего. Но мне надо сейчас. Варианты обхода? Создать обычный текстовик с названием ком порта и открывать опять таки стандартными средствами используя обычный с++(не пробовал сий вариант но все советуют, тк проект нужен статически)

А ну еще на счет чистого кути - статическая сборка проекта около 13-14 мб. Почему так много? Что туда кути тянет пихает? Проект максимум на 1-2мб. Странные особенности кути.
0
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
22.01.2015, 16:17 14
Цитата Сообщение от Sph Посмотреть сообщение
QXmlStreamReader xml_reader((const char*)xml_file); //тут не верно точно, тк не работает
Разумеется не работает. Потому как QFile и FIle - это совсем разные вещи.
Не понятно, зачем вы в Qt коде пытаетесь использовать обычный стандартный с++. Ведь Qt и стандартная библиотека вместе не особо сочетаются. Обычно либо то, либо другое. Можно конечно сделать костыли, но никто вам не даст гарантии того, что они будут работать всегда и везде, а не сломаются где-нибудь неожиданно и, самое главное, незаметно.

Честно говоря, вопрос сложный. Если примеры, как QFile превратить в std:stream ещё есть, то вот обратного не видно.
Если уж вас припечёт - вы можете, конечно написать свой собственный класс который использует std::File*, отнаследовавшись от QIODevice, но это муторно. Постарайтесь тогда вначале его поискать в интернете, скорее всего кто-нибудь уже реализовал его до вас.

P.S. Непонятно, зачем вы используете С-касты в коде? Они крайне не рекомендуются в С++.
0
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.01.2015, 16:26 15
Цитата Сообщение от Sph Посмотреть сообщение
А есть какое-то объяснение конкретное? Я не видел запрета или информации из разряда "ни в коем случае не используйте не кутишные либы\функции\классы(нужное подчеркнуть), иначе ваш проект не будет запускаться на других осях"
Ну если мы говорим о том же libstdc++ то он на каждой ОС и у каждого компилятор свой. Посмотрите на тонны ifdef'ов в Qt для каждой ОС и компилятора - вот вам и ответ.
Вот к примеру реализация clang'ом http://libcxx.llvm.org/

Цитата Сообщение от Sph Посмотреть сообщение
Вам не кажется ЭТО уже странным.
Это проблема большинства книг по программированию.

Цитата Сообщение от Sph Посмотреть сообщение
Подумаешь после меня придет кто-то и будет пытаться запустить мой проект написанный на 5й версией
Вы не поверите - но так бывает очень часто. Это называется поддержка legacy-кода. И никакой проблемы Qt в этом нет, это проблема разработки в целом.

Цитата Сообщение от Sph Посмотреть сообщение
т.е. Вы предлагаете делать так
Я не предлагаю - это суровая правда. Если вы думаете что вы можете написать код один раз и больше никогда не менять - у меня для вас плохие новости.

Цитата Сообщение от Sph Посмотреть сообщение
Банально вспоминая QSerialPort упираемся в то, что проект статически не собирается
Я собирал.

Цитата Сообщение от Sph Посмотреть сообщение
А ну еще на счет чистого кути - статическая сборка проекта около 13-14 мб.
Плата за кроссплатформеность + 100500 возможностей которые реализует Qt. Он весит много потому что умеет много. В десятки раз больше стандартной либы, если мы о std/stl.
Простой пример: если вы используете winapi - то у вас исполняемый файл получается маленьким потому что все либы уже установлены в ОС и их с собой таскать не нужно. А Qt таскает - потому что реализует системные либы сам.

Цитата Сообщение от Sph Посмотреть сообщение
Странные особенности кути.
Возьмите любую либу которая работает не только на одной платформе и сильно удивитесь ее размеру.

Добавлено через 4 минуты
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Непонятно, зачем вы используете С-касты в коде? Они крайне не рекомендуются в С++.
Пруф?
C-каст разворачивается в подходящий _cast и все.
0
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
22.01.2015, 16:35 16
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Пруф?
C-каст разворачивается в подходящий _cast и все.
Практически во всех книгах по С++ их не рекомендуют использовать. Потому что код с с++ кастами легче понять, отследить и отладить.
0
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 16:39  [ТС] 17
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Не понятно, зачем вы в Qt коде пытаетесь использовать обычный стандартный с++. Ведь Qt и стандартная библиотека вместе не особо сочетаются. Обычно либо то, либо другое. Можно конечно сделать костыли, но никто вам не даст гарантии того, что они будут работать всегда и везде, а не сломаются где-нибудь неожиданно и, самое главное, незаметно.
Понимаете в чем дело. Поступают требования, надо кроссплатформу и как можно меньше кути и больше плюсов, тк они старые, понятные, простые и всем известные. Мне лично, удобнее полльзоваться кутишными средствами(библиотеки, классы), но вот не задача, я не могу найти достаточно информации, чтобы доказать это вышестоящим людям. Нет информации что использовать смесь чистого си и кути не желательно или нельзя или не будет работать. Тот же самый char проще и знаком людям в отличии от QByteArray(да и мне тоже)
банально - передача данных по сети, пакет отправляется.
C++ (Qt)
1
2
qint64 QUdpSocket::writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)
qint64 QUdpSocket::writeDatagram(const QByteArray & datagram, const QHostAddress & host, quint16 port)
Я возьму первый вариант, тк с char'ом я могу крутить вертеть как хочу и точно буду знать как он будет работать.
Возможно это все устаревшее видение и страх перед новым.
но никто вам не даст гарантии того, что они будут работать всегда и везде, а не сломаются где-нибудь неожиданно и, самое главное, незаметно.
А есть ли гарантии что используя только qt средства я не упрусь в тупик при портировании на другую ось, на другюу версию, под другую сборку?
Я не предлагаю - это суровая правда. Если вы думаете что вы можете написать код один раз и больше никогда не менять - у меня для вас плохие новости.
Есть те же стандарты с++ которые не меняются из года в год, и не надо перечитывать информацию, чтобы понять почему в версии х.1 у меня работало а в х.9 нет.
Или я не прав?
А Qt таскает - потому что реализует системные либы сам.
Где об это можно прочитать?
0
RazrFalcon
1393 / 1250 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.01.2015, 16:45 18
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Практически во всех книгах по С++ их не рекомендуют использовать.
Не рекомендуют - это такое. В сорцах Qt с-каст часто используется.

Цитата Сообщение от Sph Посмотреть сообщение
А есть ли гарантии что используя только qt средства я не упрусь в тупик при портировании на другую ось, на другюу версию, под другую сборку?
Нет. И ни у кого другого нет.

Цитата Сообщение от Sph Посмотреть сообщение
Есть те же стандарты с++ которые не меняются из года в год
Стандарт не меняется, а реализации стандарта меняются. Стандарт С++ - это бумажка, а не код. Он ни к чему не обязывает.

Цитата Сообщение от Sph Посмотреть сообщение
Где об это можно прочитать?
Что именно почитать?
0
Sph
158 / 42 / 10
Регистрация: 25.08.2014
Сообщений: 345
22.01.2015, 16:59  [ТС] 19
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Плата за кроссплатформеность + 100500 возможностей которые реализует Qt. Он весит много потому что умеет много.
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Простой пример: если вы используете winapi - то у вас исполняемый файл получается маленьким потому что все либы уже установлены в ОС и их с собой таскать не нужно. А Qt таскает - потому что реализует системные либы сам.
Вот про это почитать, почему ехе большой, что таскает с собой qt, почему и тп

Добавлено через 1 минуту
Просто банально на вопрос - почему обычный с++ проект весит 1-2 мб а кутишный 15? при сборке сишка цепляет из либ только то что надо, какого лешего кути тянет ВСЕ и сразу и зачем.
- вот на такой вопрос корректного ответа у меня пока нет, потому и интересуюсь.
0
Shtirliz72
202 / 162 / 41
Регистрация: 25.10.2013
Сообщений: 527
22.01.2015, 17:05 20
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Не рекомендуют - это такое. В сорцах Qt с-каст часто используется.
С сорцах Qt много чего используют. Однако в Qt Coding Style черным по белому написано: Avoid C-style casts when possible.

Цитата Сообщение от Sph Посмотреть сообщение
А есть ли гарантии что используя только qt средства я не упрусь в тупик при портировании на другую ось, на другюу версию, под другую сборку?
Абсолютных гарантий вам не даст никто и нигде, но вероятность подобного должна быть ниже.
Цитата Сообщение от Sph Посмотреть сообщение
Понимаете в чем дело. Поступают требования, надо кроссплатформу и как можно меньше кути и больше плюсов, тк они старые, понятные, простые и всем известные. Мне лично, удобнее полльзоваться кутишными средствами(библиотеки, классы), но вот не задача, я не могу найти достаточно информации, чтобы доказать это вышестоящим людям. Нет информации что использовать смесь чистого си и кути не желательно или нельзя или не будет работать. Тот же самый char проще и знаком людям в отличии от QByteArray(да и мне тоже)
банально - передача данных по сети, пакет отправляется.
Понимаю. Однако в данном случае лучше всё же использовать Qt, потому как QIODevice завязан на Qt.
Или есть обход - считайте весь файл в память с помощью fread или аналогичной функции, а затем передайте полученный результат его(char*) в QByteArray. QByteArray вы уже сможете применить с QXmlStreamReader.
0
22.01.2015, 17:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2015, 17:05

Нет нужного класса в библиотеке для парсинга XML
Всем привет! Вчера начал изучать C# для написания логики под среду playerIO. Столкнулся вот с...

Выбор языка программирования для парсинга
Уважаемые форумчане помогите с выбором языка программирования для парсинга веб страниц.

Обработка ошибки при загрузке для парсинга xml файла
помогите пожалуйста как сделать действие чтоб при ошибке загрузки файла по ссылке можно было это...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.