Qt не открывается файл

Обновлено: 03.07.2024

Создание файла Qt XML, чтение введения и решение «перезаписать XML не может охватить исходный контент»

Введение XML

XML (Extensible Markup Language, Extensible Markup Language) - это язык разметки, похожий на HTML, предназначенный для передачи данных, а не для отображения данных. XML-теги не определены заранее, и пользователи должны сами определять их при их использовании. XML является рекомендуемым стандартом W3C (World Wide Web Consortium). Относительно двумерного представления таблиц базы данных, древовидная структура, используемая XML, более способна показать включение данных.В качестве формата текстового файла простые и понятные характеристики XML делают его очень популярным в области хранения и описания информации.

Qt предоставляет модуль Qt XML для обработки XML-документов.Есть два основных метода анализа: метод DOM, который можно читать и записывать, и метод SAX, который можно читать. Однако, начиная с Qt 5, модуль Qt XML больше не обеспечивает обслуживание, но рекомендуется использовать QXmlStreamReader и QXmlStreamWriter в модуле Qt Core для чтения и записи XML. Это потоковый метод.

Если вы хотите использовать модуль Qt XML, вам нужно добавить строку QT + = xml в файл проекта (файл .pro).

Примеры стандартных документов XML:

DOM (объектная модель документа) - это рекомендуемый стандарт W3C. Он предоставляет интерфейс для доступа и изменения содержимого и структуры файла XML и может представлять документ XML в виде иерархического древовидного представления, хранящегося в памяти. Сам документ представлен объектом QDomDocument, а все узлы DOM в дереве документа являются подклассами класса QDomNode.

Класс QDomProcessingInstruction используется в Qt для представления инструкций XML. Элемент соответствует классу QDomElement. Атрибут соответствует классу QDomAttr. Текстовое содержимое представлено классом QDomText. Все узлы DOM, такие как описания, элементы, атрибуты и текст, представлены с использованием QDomNode.

Ниже приведен простой пример для создания и чтения файлов XML.

Создание XML

Содержимое сгенерированного файла конфигурации выглядит следующим образом:

Чтение XML

Есть еще один способ прочитать:

Решение «Перезапись XML не может перезаписать исходный контент»

Если мы хотим перезаписать исходные данные в XML, переписать данные, используйте

Открыть файл таким образом, Truncate означает переписать, очистить исходные данные файла. Однако в проекте возникли следующие проблемы: при перезаписи данных исходные данные не могли быть перезаписаны, а новые данные были добавлены следующим образом:

Наконец нашел причину:

В моем проекте, когда программное обеспечение открыто, данные файла конфигурации загружаются по умолчанию, однако я установил объекты, которые читают и создают элементы XML, как глобальные.

Когда программное обеспечение открыто, файл конфигурации считывается, и эти переменные заняты и не освобождаются. Затем, когда я перезаписываю содержимое XML, я не могу очистить и заменить занятые данные, что приводит к новым данным файла конфигурации, сгенерированным под исходными данными.

Установите эти объекты, которые читают и создают элементы XML, как локальные переменные и автоматически освобождают их после одного использования, не мешая другим операциям. Это правильно

Здравствуйте, нужно распарсить xml файл, почитал документацию, остановился на QXmlStreamReader.

Но столкнулся с проблемой, что не хочет открываться файл, лежащий в той же директории, что и исходники.
Все собирается, но при попытки начать парсить вылазит ошибка: Couldn't open input.osm
Привожу код: (судя по всему что-то не так в строках 23-27

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


QFile открытие файла с конкатенацией
Доброго времени суток. Есть такой код, он отрабатывает, и нормально открывает файл и пишет.


Чтение и запись файла используя класс QFile
Всем доброго здравия! Пытаюсь работать с устройством /dev/usbtmc1 (linux xubuntu), которое.

Открытие и чтение PDF-файла
Нужно написать код программы для открытия и чтения pdf файла в eclipse

не хочет открываться файл, лежащий в той же директории, что и исходники А откуда программа знает, где ее исходники лежат?
Положите файл в папку с исполняемым файлом, и чтобы наверняка
А откуда программа знает, где ее исходники лежат?
Положите файл в папку с исполняемым файлом, и чтобы наверняка
А что собственно за ошибка выводится?
Попробуйте еще так
А что собственно за ошибка выводится?
Попробуйте еще так

Возможно синтаксическая ошибка?

if (!file->open(QIODevice::ReadOnly|QIODevice: ; Text))

Возможно синтаксическая ошибка?

if (!file->open(QIODevice::ReadOnly|QIODevice: ; Text))

Тот же самый результат
Система Mac OS. Qt 5.0.1. Сейчас попробую под виндой собрать

Добавлено через 8 минут
Под виндой собирается и, вроде, файл открывается, но при начале парсинга xmlReader, когда считывает эелементы упирается в ошибку: Permature end of document
т.е в цикл она заходит всего один раз и на первой же проверке вылетает из него(

А что интересно будет, если Ваш файл открыть в браузере или в какой-нибудь xml-читалке, предварительно поменяв расширение на xml? А что интересно будет, если Ваш файл открыть в браузере или в какой-нибудь xml-читалке, предварительно поменяв расширение на xml? Значит все таки Qt не открывает файл как положено. Я думаю проблема может быть связана с кодировками. Значит все таки Qt не открывает файл как положено. Я думаю проблема может быть связана с кодировками. Насколько я знаю - нет, но можно поэкспериментировать c QTextCodec::setCodecForLocale() для начала укажите файлу полный путь, собираете вы приложение в той же директории где и исходники ? для начала укажите файлу полный путь, собираете вы приложение в той же директории где и исходники ?

Да, в той же где и исходники.

Проблема решилась простым изменением расширения у файла: .osm заменил на .xml и все прекрасно заработало, но остался вопрос, связанный с тем, что неужели QXmlStreamReader/Writer работают с файлами, расширение которых искулючительно .xml ? В документации не обнаружил. Хотя есть предположение, что не reader/writer дело, может еще QFile не знает такого расширения, что очень странно, ввиду того, что ему должно быть все равно на расширение.
Никто не сталкивался с такой войной расширений ?

We recommend hosting TIMEWEB

и скажите пожалуйста, что такое cache

и по предложенной Вами ссылки также делают

cache это название соединения

тогда будет какая-то базовая название соединения

если я не ошибаюсь вот так будет работать твой вариант, так как при таком, ты не передаешь соединения для квери

Сделал тренировочную таблицу. Если вот так писать, то при первом запросе нет ошибок, но при повторе действия выдает ошибку QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

Смотрел в редакторе SQL, данные не добавляются.

Подскажите пожалуйста, что не так.

и если делать так, тоже не работает

мені по російски важко писати тому, моежш перкласти ))))

помилка виникає тому що ти намагаєшся створити ще одне з'єднання з такоюж назвою, щоб це зробити спочатку потрібно видалити старе з'єднання

ти можеш зробити так

якщо у вас плануєтсяь виокористовувати одну базу то яб просто встановив зєднання десь на початку програми і потім просто на нього зсилався

усі конекти до бази в Qt є статичними

по приклату який ти скинув важно щось сказати.

Из опыта: Прежде чем использовать запрос в QSqlQuery напиши его и выполни непосредственно на базе данных. Убедись что он работает а потом переноси уже в программу. Сразу отпадет масса вопросов.

тому що цей запит не коректний, в тебе там зайві коми, зайва крапка з комою

порівняй з от цим

Большое спасибо всем за помощь.

Добрий день.
Я реалізую з'єдання з БД у окремому потоці.

dbName = "my_db_" + QString::number((quint64)QThread::currentThread(), 16);

db = QSqlDatabase::addDatabase("QSQLITE", dbName);
db.setPort(dataBase->port());
db.setHostName(dataBase->hostName());
db.setDatabaseName(dataBase->databaseName());
dbIsValid = db.open();

І БД відкривається. Проте при створення QSqlQuery:

Робота з потоками організована на основі signal-slot в Qt::DirectConnection.
Підкажіть, будь-ласка, що може бути не так?

Рекомендуем хостинг TIMEWEB

и скажите пожалуйста, что такое cache

и по предложенной Вами ссылки также делают

cache это название соединения

тогда будет какая-то базовая название соединения

если я не ошибаюсь вот так будет работать твой вариант, так как при таком, ты не передаешь соединения для квери

Сделал тренировочную таблицу. Если вот так писать, то при первом запросе нет ошибок, но при повторе действия выдает ошибку QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

Смотрел в редакторе SQL, данные не добавляются.

Подскажите пожалуйста, что не так.

и если делать так, тоже не работает

мені по російски важко писати тому, моежш перкласти ))))

помилка виникає тому що ти намагаєшся створити ще одне з'єднання з такоюж назвою, щоб це зробити спочатку потрібно видалити старе з'єднання

ти можеш зробити так

якщо у вас плануєтсяь виокористовувати одну базу то яб просто встановив зєднання десь на початку програми і потім просто на нього зсилався

усі конекти до бази в Qt є статичними

по приклату який ти скинув важно щось сказати.

Из опыта: Прежде чем использовать запрос в QSqlQuery напиши его и выполни непосредственно на базе данных. Убедись что он работает а потом переноси уже в программу. Сразу отпадет масса вопросов.

тому що цей запит не коректний, в тебе там зайві коми, зайва крапка з комою

порівняй з от цим

Большое спасибо всем за помощь.

Добрий день.
Я реалізую з'єдання з БД у окремому потоці.

dbName = "my_db_" + QString::number((quint64)QThread::currentThread(), 16);

db = QSqlDatabase::addDatabase("QSQLITE", dbName);
db.setPort(dataBase->port());
db.setHostName(dataBase->hostName());
db.setDatabaseName(dataBase->databaseName());
dbIsValid = db.open();

І БД відкривається. Проте при створення QSqlQuery:

Робота з потоками організована на основі signal-slot в Qt::DirectConnection.
Підкажіть, будь-ласка, що може бути не так?

Читайте также: