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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Обращение к данным по индексу  (Прочитано 10419 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #15 : Сентябрь 12, 2012, 16:14 »

Пациент скорее мёртв, чем жив....
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #16 : Сентябрь 12, 2012, 16:16 »

Посмотрите, такой способ корректен, ничего не напутал не намудрил?)
Намудрил так, что даже странно, что не попутал.
Код
C++ (Qt)
struct str
{
   QString name;
};
 
inline QDataStream &operator <<(QDataStream &steam, const str &data)
{
   stream << data.name;
   return stream;
}
 
inline QDataStream &operator >>(QDataStream &steam, str &data)
{
   stream >> data.name;
   return stream;
}
 

Запись в файл:
Код
C++ (Qt)
str data;
data.name = "aaaaa";
...
QDataStream strm(&theFile);
strm << data;  
 

Чтение из файла:
Код
C++ (Qt)
str data;
QDataStream strm(&theFile);
strm >> data;
 
« Последнее редактирование: Сентябрь 12, 2012, 16:39 от xokc » Записан
Serr500
Гость
« Ответ #17 : Сентябрь 12, 2012, 20:24 »

Е... мой старый ... !!!
Код:
str dat;
QByteArray arr;
file.write(arr, sizeof(dat));
Это даже хуже, чем я предполагал.  Обеспокоенный
Записан
Pixel
Гость
« Ответ #18 : Сентябрь 12, 2012, 20:43 »

xokc, это я все знаю, стандартная запись через поток. А как мне считать структуру из середины не прочесывая предыдущие?
Serr500, вы пишите намеками. Я только начал изучать Qt, я их не понимаю. Сложно что ли написать пример как сделал это господин xokc, только по сабжу? Если лень, то дайте хотя бы ссылку на статью, только на ту, которая мне объяснит мою проблему, а не просто "работа с данными на Qt". Таких я уже прочитал уйму, но ни в одной не решается моя проблема, иначе я бы сюда не обращался.
Записан
Serr500
Гость
« Ответ #19 : Сентябрь 12, 2012, 20:51 »

Serr500, вы пишите намеками. Я только начал изучать Qt, я их не понимаю.
Вы не понимаете не Qt, а основы языка C++.

Сложно что ли написать пример как сделал это господин xokc, только по сабжу?
А зачем? Господин xokc уже всё написал.

xokc, это я все знаю, стандартная запись через поток. А как мне считать структуру из середины не прочесывая предыдущие?
У Вас вдобавок к незнанию Qt и C++ ещё и невнимательность:
Я предлагаю такое решение: пишете через QDataStream, используя удобные операторы  <<. По ходу дела запоминаете позицию и размер записи напр так
Код:
... // открыли файл для записи
QDataStream strm(&theFile);
qint64 theDataStart = -1, theDataSize = -1;
...
theDataStart = strm.device()->pos();  // запомнили позицию первой записи
strm << theData;           // цивильно записали
theDataSize = strm.device()->pos() - theDataStart;  // запомнили размер записи на диске
Теперь читаем nth запись
Код:
void ReadRecNo( QDataStream & strm, int recNo, MyData & theData )
{
 strm.device()->seek(theDataStart + theDataSize * recNo);
 strm >> theData;           
}

Edit: ну разумеется это предполагает что все записи одного размера. Если это не так то надо создавать массив/контейнер theDataStart
Объедините то, что написали xokc и Igors и задача будет решена.
Записан
V1KT0P
Гость
« Ответ #20 : Сентябрь 12, 2012, 20:53 »

xokc, это я все знаю, стандартная запись через поток. А как мне считать структуру из середины не прочесывая предыдущие?
Serr500, вы пишите намеками. Я только начал изучать Qt, я их не понимаю. Сложно что ли написать пример как сделал это господин xokc, только по сабжу? Если лень, то дайте хотя бы ссылку на статью, только на ту, которая мне объяснит мою проблему, а не просто "работа с данными на Qt". Таких я уже прочитал уйму, но ни в одной не решается моя проблема, иначе я бы сюда не обращался.
Все зависит от условий задачи.
Например если у нас структура фиксированного размера и необходимо один раз записать и потом считывать, то для доступа к структуре перемещаемся в файле в позицию РАЗМЕР_СТРУКТУРЫ * НОМЕР_СТРУКТУРЫ.
Если структуры не фиксированного размера, но опять-же нам надо один раз записать и потом считывать, то заводим два файла, в первый тупо по порядку складываем структуры, а во второй смещение каждой структуры. В результате для доступа к структуре переходим во втором файле в позицию НОМЕР_СТРУКТУРЫ * РАЗМЕР_СМЕЩЕНИЯ_СТРУКТУРЫ и читаем оттуда переменную СМЕЩЕНИЕ_СТРУКТУРЫ размером РАЗМЕР_СМЕЩЕНИЯ_СТРУКТУРЫ. Далее переходим в первом файле в позицию СМЕЩЕНИЕ_СТРУКТУРЫ и считываем структуру.
Если же надо еще и добавлять/удалять/изменять то лучше ищи готовую библиотеку, ибо ты для более сложных вещей еще не готов.
Записан
Serr500
Гость
« Ответ #21 : Сентябрь 12, 2012, 20:57 »

Pixel, вот вам задачка на знание языка C++ (не Qt!):
Код:
struct Struct 
{
    char* str;
} S;
S.str = "bla-bla-bla";

QFile File("file.out");
File.open(QIODevice::ReadWrite);
File.write(&S, sizeof(S));
Что будет в файле?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Сентябрь 12, 2012, 22:45 »

Если структуры не фиксированного размера, но опять-же нам надо один раз записать и потом считывать, то заводим два файла, в первый тупо по порядку складываем структуры, а во второй смещение каждой структуры. В результате для доступа к структуре переходим во втором файле в позицию НОМЕР_СТРУКТУРЫ * РАЗМЕР_СМЕЩЕНИЯ_СТРУКТУРЫ и читаем оттуда переменную СМЕЩЕНИЕ_СТРУКТУРЫ размером РАЗМЕР_СМЕЩЕНИЯ_СТРУКТУРЫ. Далее переходим в первом файле в позицию СМЕЩЕНИЕ_СТРУКТУРЫ и считываем структуру.
Что-то уж очень тупо таскать/сбивать 2 файла Улыбающийся Лучше все в одном с TOC как напр это было в wad файлах

Если же надо еще и добавлять/удалять/изменять то лучше ищи готовую библиотеку, ибо ты для более сложных вещей еще не готов.
Ну не надо "надувать щеки", там ничего сложного  Улыбающийся
Записан
V1KT0P
Гость
« Ответ #23 : Сентябрь 12, 2012, 23:15 »

Что-то уж очень тупо таскать/сбивать 2 файла Улыбающийся Лучше все в одном с TOC как напр это было в wad файлах

Ну не надо "надувать щеки", там ничего сложного  Улыбающийся
Это для "нас" ничего сложного, а у автора топика вызывает сложность даже банальная запись текста в файл.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #24 : Сентябрь 13, 2012, 08:52 »

xokc, это я все знаю, стандартная запись через поток. А как мне считать структуру из середины не прочесывая предыдущие?
Если Вы собираетесь записывать в файл структуры разных размеров (а я надеюсь, что Вы понимаете, что размеры данных, находящихся в тех структурах, которые Вы нам показали будут разными в зависимости от длинны строки), то простого решения для обеспечения прямого доступа к данным в файле не получится.
Если нужно использовать только один файл и нельзя использовать готовые решения, то я бы делал в начале файла область для индексов, где указывал бы откуда надо читать данные. Но это уже совсем другая задача. Никто за Вас тут её решать не будет.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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