Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 23:36   #1
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
Плохо Структура не сохраняется в TFileStream

Здравствуйте. Почему-то не сохраняется в файл структура, да не то структура, даже обычные переменные не сохраняются.
Архивчик прикрепляю...

Процедуры для просмотра SaveTest и OpenTest
Файлик с названием test получается в результате сохранения
А структура сформированная для сохранения выглядит так:

Код:
ШАБЛОН!!!
TQuestion = record
                Name        :string[255]; // Вопрос
                Num         :integer;     // номер вопроса
                TrueCount   :integer;     // количество верных ответов
                Answer      :array of string[255]; // массив ответов
                ResultValue :array of Boolean;     // ложный или истинный ответ
                Modified    :boolean; // проверка на изменение записи
              end;

Представление занесённых данных
 TQuestion = record
                Name        :string[255]; // Вопрос №1
                Num         :integer;     // 1
                TrueCount   :integer;     // 1
                Answer      :array of string[255]; // Answer[1] =да; Answer[2] =нет 
                ResultValue :array of Boolean; // ResultValue[1]=true; ResultValue[2]=false;
                Modified    :boolean; // true
              end;
Заранее благодарен.
Вложения
Тип файла: rar Tester.rar (148.9 Кб, 9 просмотров)
Arkuz вне форума Ответить с цитированием
Старый 22.04.2010, 23:56   #2
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

SaveOpenFileStream.Write(str,length (str)*SizeOf(str[1]));
пауэрлифтинг вне форума Ответить с цитированием
Старый 22.04.2010, 23:58   #3
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

SizeOf(string) будет всегда 4 байта так так сохраняется только указатель
когда читаеш SaveOpenFileStream.Read(str,SizeOf( str)); тоже размер читаемой строки не известен. надо сформировать структуру файла где бутет храниться размер строки а потом сама строка

Последний раз редактировалось пауэрлифтинг; 23.04.2010 в 00:03.
пауэрлифтинг вне форума Ответить с цитированием
Старый 23.04.2010, 00:41   #4
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

пауэрлифтинг, а что касается записи, как мне выделить память под структуру. Тем более что в ней хранятся массивы строк, да ещё неопределённые массивы....

Что же за формула получается...?
Arkuz вне форума Ответить с цитированием
Старый 23.04.2010, 00:58   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

память под структуру выделяем как обычно, через new
а вот насчет сохранения/чтения записей.
вам нужно дин массив выделить последним в записи.
далее нужно длина этого массива как поле структуры
Код:
TQuestion = record
                Name        :string[255]; // Вопрос
                Num         :integer;     // номер вопроса
                TrueCount   :integer;     // количество верных ответов
                Answer      :array of string[255]; // массив ответов
                Modified    :boolean; // проверка на изменение записи
                ResultValueLength:integer;
                ResultValue :array of Boolean;     // ложный или истинный ответ
              end;
пример:
переменки
Код:
Q:TQuestion;
S:TStream;//(актуально для всех потоков)
теперь сохраняем в потоке
Код:
Q.ResultValueLength:=Length(Q.ResultValue);
S.Write(Q,SizeOf(Q)-(SizeOf(Pointer)*1));
S.Write(Q.ResultValue[0],Length(ResultValue)*SizeOf(boolean));
и чтение
Код:
S.Read(Q,SizeOf(Q)-(SizeOf(Pointer)*1));
SetLength(Q.ResultValue,Q.ResultValueLength);
S.Read(Q.ResultValue[0],Length(ResultValue)*SizeOf(boolean))
* делаем поправку размера(нам не нужно сохранять указатель на массив(который еще и не совпадет потом с данными)
тут 1 это количество динамических массивов структуры(да-да-да, можно хранить так структуры хоть с тысячью дин массивов)

** тип сохраняемого дин массива(array of boolean)

вот так
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.04.2010, 01:31   #6
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

Код:
TQuestion = record
                Name        :string[255]; // Вопрос
                Num         :integer;     // номер вопроса
                TrueCount   :integer;     // количество верных ответов
                Answer      :array of string[255]; // массив ответов
                ResultValue :array of Boolean;     // ложный или истинный ответ
                Modified    :boolean; // проверка на изменение записи
              end;
вот так еще можно:
Код:
var f: file;
i,t: integer;
begin
assignfile(f,'test.dat');
rewrite(f,1);
blockwrite(Name,sizeof(Name));
blockwrite(Num,sizeof(Num));
blockwrite(TrueCount,sizeof(TrueCount));
i:=length(Answer);
blockwrite(i,sizeof(i));
for t:=0 to i-1 do
blockwrite(Answer[t],sizeof(Answer[t]));
i:=length(ResultValue);
blockwrite(i,sizeof(i));
for t:=0 to i-1 do
blockwrite(ResultValue[t],sizeof(ResultValue[t]));
blockwrite(Modified,sizeof(Modified));
closefile(f);
а читать:
Код:
var f: file;
i,t: integer;
begin
assignfile(f,'test.dat');
reset(f,1);
blockread(Name,sizeof(Name));
blockread(Num,sizeof(Num));
blockread(TrueCount,sizeof(TrueCount));
blockread(i,sizeof(i));
setlength(Answer,i);
for t:=0 to i-1 do
blockread(Answer[t],sizeof(Answer[t]));
blockread(i,sizeof(i));
setlength(ResultValue,i);
for t:=0 to i-1 do
blockread(ResultValue[t],sizeof(ResultValue[t]));
blockread(Modified,sizeof(Modified));
closefile(f);
(могут быть синтаксические ошибки писал без delphi)

Последний раз редактировалось пауэрлифтинг; 23.04.2010 в 01:44.
пауэрлифтинг вне форума Ответить с цитированием
Старый 23.04.2010, 11:51   #7
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Спасибо, буду пробовать...
Arkuz вне форума Ответить с цитированием
Старый 23.04.2010, 11:56   #8
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Пепел Феникса не понятно для чего
Код:
ResultValue :array of Boolean;     // ложный или истинный ответ
делать динамическим? Может вы не так поняли его предназначение?
Arkuz вне форума Ответить с цитированием
Старый 23.04.2010, 14:30   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас он и есть динамический(длина не фиксированна)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.04.2010, 15:30   #10
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Пепел Феникса, оказывается я не понял вас. Я не правильно прочитал.

Вот как я это понял, если что поправьте.
Заводим поле ResultValueLength:integer; для определения размера, чтобы потом выделять при записи и чтении.
Ну а последним это поле ResultValue :array of Boolean;, чтобы определять память по полю ResultValueLength:integer;?
Видимо так...
Arkuz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не сохраняется Rebel123 Общие вопросы Delphi 11 08.07.2009 19:37
Объясните мне TFileStream Манжосов Денис :) Помощь студентам 1 15.11.2008 13:36
проблемы с TFileStream andrey4623 Общие вопросы Delphi 9 01.11.2007 20:44
сохранение изображения с TFileStream andrey4623 Общие вопросы Delphi 10 20.10.2007 20:28
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22