Russian Qt Forum
Сентябрь 30, 2024, 18:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Редактирование файла с помощью QDataStream  (Прочитано 14021 раз)
Yegor
Гость
« : Апрель 08, 2015, 16:22 »

Здравствуйте, уважаемые форумчане!

У меня есть бинарный файл, который я создал с помощью QDataStream. Открыл файл только для записи...
Код
C++ (Qt)
// Open cur tmpl file for reading only.
QFile file(strFilePath);
if(!file.open(QIODevice::WriteOnly))
   throw tr("Can't open file %1\n%2")
       .arg(strFilePath)
       .arg(file.errorString());
 
// Set data stream.
QDataStream out(&file);
out.setByteOrder(QDataStream::LittleEndian); //Set endian.
out.setVersion(QDataStream::Qt_5_4);         //Set byte order.
 
...и далее кидал туда объекты с помощью сериализации.

Код
C++ (Qt)
out << m_strCommnets // The comment text.
.....................
out << other_obj1;
out << other_obj2;
 

В самом начале я сохранил объект m_strComment, далее уже остальные объекты.

Вопрос: как можно в следующий раз открыть файл для редактирования, чтобы изменить лишь эту переменную  m_strComment, а остальные не трогать. При этом используя класс QDataStream?
« Последнее редактирование: Апрель 10, 2015, 12:54 от Yegor » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Апрель 08, 2015, 16:24 »

Код
C++ (Qt)
in >> m_strCommnets; // The comment text.
?
Записан

Zerkin
Чайник
*
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #2 : Апрель 08, 2015, 16:30 »

У стрима device()->seek(0). А дальше как указали выше. Если я вас правильно понял.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Апрель 08, 2015, 17:18 »

Имхо, длина m_strCommnets должна быть постоянной, чтобы не поплыло ничего
Записан
Yegor
Гость
« Ответ #4 : Апрель 08, 2015, 17:38 »

Я имел ввиду, что нужно считать...
Код
C++ (Qt)
in >> m_strCommnets; // The comment text.
...отредактировать, а затем вернуть отредактированный QString обратно в файл. Чтобы структура файла не нарушилась (позже можно было повторно загружать все объекты). Как внутри одного и того же файла редактировать первый объект?
Записан
Smogg
Гость
« Ответ #5 : Апрель 08, 2015, 18:08 »

Определиться с необходимой и достаточной длинной m_strCommnets. При превышении - принудительно обрезать. При недостатке - забивать хвост строки "невозможными символами" (даже ASCII имеет всякую никчемную дребедень, а юникод и подавно). Таким костыльным макаром строка будет всегда статичного размера.

Как то так?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Апрель 08, 2015, 20:09 »

При недостатке - забивать хвост строки "невозможными символами"
Я бы посоветовал эти "невозможные символы" заменить нолями. Так в случае отладки не будут морочить голову, если вдруг забудется, что строка фиксированной длинны.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 09, 2015, 08:21 »

Право, ответы меня удивили
Вопрос: как можно в следующий раз открыть файл для редактирования, чтобы изменить лишь эту переменную  m_strComment, а остальные не трогать. При этом используя класс QDataStream?
Эта затея мертворожденная - никогда не пытайтесь "редактировать" файл данных. Если такая необходимость возникла - значит вместо файла надо юзать СУБД. А файл перезаписывайте всегда "с нуля", в крайнем случае можно "пополнять" (дописывать в хвост), но это редко. 
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Апрель 09, 2015, 09:37 »

Право, ответы меня удивили
+1 Особенно последний.

А файл перезаписывайте всегда "с нуля", в крайнем случае можно "пополнять" (дописывать в хвост), но это редко. 
Ерунда. Это зависит от задачи.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #9 : Апрель 09, 2015, 09:46 »

Igors, hex редакторы, ведь, не переписывают файлы с 0, если мы просто поправим первый байт в 200Гб файле.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Апрель 09, 2015, 09:52 »

Igors, hex редакторы, ведь, не переписывают файлы с 0, если мы просто поправим первый байт в 200Гб файле.
Если "файл" это расписание дня домохозяйки, то его можно хоть по 100 раз на дню перезаписывать. Улыбающийся
Но в мире есть файлы, которые нужно править не переписывая полностью.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Апрель 09, 2015, 10:01 »

Если "файл" это расписание дня домохозяйки, то его можно хоть по 100 раз на дню перезаписывать. Улыбающийся
Если уж на то пошло, то и расписание домохозяйки можно править Улыбающийся
Главное, чтобы строки были фиксированной ширины
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 09, 2015, 10:19 »

Главное, чтобы строки были фиксированной ширины
Не улавливаете аналогии с "поля", "записи"? Очень быстро приходит ощущение что городится велосипед, причем самый никудышний - какое-то самопальное СУБД. Зачем если это можно сделать цивильно и с куда меньшими затратами.

Но в мире есть файлы, которые нужно править не переписывая полностью.
В мире может и есть, но одобрять желание начинающего копаться seek'ом для перезаписи файла - это просто неграмотно. Самая настоящая "ерунда"  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Апрель 09, 2015, 10:35 »

В мире может и есть, но одобрять желание начинающего копаться seek'ом для перезаписи файла - это просто неграмотно. Самая настоящая "ерунда"  Улыбающийся
Неграмотно делать громкие ошибочные заявления от лица всей отрасли. Но вам не привыкать...  Смеющийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Апрель 09, 2015, 10:45 »

Не улавливаете аналогии с "поля", "записи"? Очень быстро приходит ощущение что городится велосипед, причем самый никудышний - какое-то самопальное СУБД. Зачем если это можно сделать цивильно и с куда меньшими затратами.
В упор не вижу связи между задачей автора и СУБД.
Как вы запишите в СУБД то, что я запишу в файл в виде структуры:

Строка длинной 30
Количество флоатов
массив флоатов
Количество интов
Массив интов
?

По мне так, для такой простой задачи тянуть в проект СУБД = боль. Особенно, если я не знаком с SQL
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.26 секунд. Запросов: 23.