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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2014, 18:39   #1
sanji2010
Пользователь
 
Регистрация: 25.11.2013
Сообщений: 52
По умолчанию Сохранение/чтение в нетипизированный файл массива используя потоки

Здравствуйте, необходима помощь, так как не понимаю использования потоков, сделал без них, преподаватель сказал переделать, а так же считать с файла через OpenDialog.
Это описание переменных и типа записи.
Код:
type
  Ticq=record
       Uin: Cardinal;
       Name: string;
       mail: string;
       phone: string;
  end;
const
MaxSize=20;
var
  Form1: TForm1;
  ICQ: Ticq;
  MasIcq: array [1..MaxSize] of Ticq;
  p: Integer;
Имеется данная процедура для сохранения в файл, используя SaveDialog.
Код:
procedure TForm1.SaveFileClick(Sender: TObject);
var FName: string; num:Integer;
    F: TextFile;
begin
 if p=0 then
   begin
   ShowMessage('База пуста!');
   Exit;
   end
 else
SaveInFile.FileName := FName;
if SaveInFile.Execute then
 begin
  FName := SaveInFile.FileName;
  AssignFile(f,FName);
  Rewrite(f);
  for num:=1 to p do begin
   writeln(F,MasIcq[num].Uin);
   writeln(F,MasIcq[num].Name);
   writeln(F,MasICQ[num].Mail);
   writeln(F,MasICq[num].phone);
  end;
  CloseFile(F);
 end;
end;
Мне необходимо сохранить массив записей в файл, используя потоки, а так же процедура считывания из файла и записать в массив записей, так же используя потоки
Skype sanji-dim
Свою благодарность можно выразить на счёт R393628098492
sanji2010 вне форума Ответить с цитированием
Старый 12.11.2014, 19:48   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

TSaveDialog не имеет отношения к сохранению, его функция - выбор имени.
Остальное – в корне неверно, т.к. ты юзаешь текстовый файл, а по условию надо бинарник.

Но я, конечно, знаю, как сделать твою лабу через какого-нить потомка TStream. Нужно вместе с полем сохранять его размер.
Если утром задача будет ещё актуальна, свяжись со мной.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.11.2014, 20:10   #3
sanji2010
Пользователь
 
Регистрация: 25.11.2013
Сообщений: 52
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
TSaveDialog не имеет отношения к сохранению, его функция - выбор имени.
Остальное – в корне неверно, т.к. ты юзаешь текстовый файл, а по условию надо бинарник.

Но я, конечно, знаю, как сделать твою лабу через какого-нить потомка TStream. Нужно вместе с полем сохранять его размер.
Если утром задача будет ещё актуальна, свяжись со мной.
Да, я знаю, то что я скинул выше, естественно не верно, т.к. я там вообще поток не юзаю. Нашёл, в принципе, информацию в интернете, но не знаю как связать с компонентами. Так ли это выполняется?
Код:
type
  TPerson = record
    Name: String;
    Age: Integer;
    Salary: Currency;
  end;
 
  TPersons = array of TPerson;
 
// Сохранение в файл
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TFileStream;
  Values: TPersons;
  Index: Integer;
begin
  SetLength(Values, 3);
  for Index := 0 to High(Values) do
  begin
    Values[Index].Name := 'Person #' + IntToStr(Index);
    Values[Index].Age := Random(20) + 20;
    Values[Index].Salary := Random(10) * 5000;
  end;
 
  F := TFileStream.Create(ExtractFilePath(GetModuleName(0)) + 'Test.bin', fmCreate or fmShareExclusive);
  try
    for Index := 0 to High(Values) do
    begin
      WriteBufferDyn(F, Values[Index].Name);
      F.WriteBuffer(Values[Index].Age, SizeOf(Values[Index].Age));
      F.WriteBuffer(Pointer(@Values[Index].Salary)^, SizeOf(Values[Index].Salary));
    end;
  finally
    FreeAndNil(F);
  end;
end;
 
// Загрузка из файла
procedure TForm1.Button2Click(Sender: TObject);
var
  F: TFileStream;
  Values: TPersons;
  Value: TPerson;
begin
  F := TFileStream.Create(ExtractFilePath(GetModuleName(0)) + 'Test.bin', fmOpenRead or fmShareDenyWrite);
  try
    while not EoS(F) do
    begin
      ReadBufferDyn(F, Value.Name);
      F.ReadBuffer(Value.Age, SizeOf(Value.Age));
      F.ReadBuffer(Pointer(@Value.Salary)^, SizeOf(Value.Salary));
 
      SetLength(Values, Length(Values) + 1);
      Values[High(Values)] := Value;
    end;
  finally
    FreeAndNil(F);
  end;
 
  // Здесь Values тождественно равны исходным данным из Button1Click
end;
Skype sanji-dim
Свою благодарность можно выразить на счёт R393628098492
sanji2010 вне форума Ответить с цитированием
Старый 12.11.2014, 20:38   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
WriteBufferDyn
ReadBufferDyn
шо за функции?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.11.2014, 21:06   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://www.gunsmoker.ru/2011/11/blog-post_12.html

WriteBufferDyn и ReadBufferDyn тоже от туда
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.11.2014, 21:14   #6
sanji2010
Пользователь
 
Регистрация: 25.11.2013
Сообщений: 52
По умолчанию

Компилятор ругается на EoS, хотя и вправду вижу данную функцию впервые
Skype sanji-dim
Свою благодарность можно выразить на счёт R393628098492
sanji2010 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла,перевод из доп кода в прямой из него в десятичный и дальнейшее сохранение в файл С# DimaLord Помощь студентам 2 21.01.2014 00:39
Вопрос Сохранение массива в файл и чтение массива из файла vvzvlad Помощь студентам 2 05.11.2013 23:27
Сохранение массива в файл Дмитрий Стариков Общие вопросы Delphi 7 26.09.2010 19:51
Сохранение массива в файл Artem Общие вопросы Delphi 10 11.12.2007 20:00
TEdit сохранение в файл и чтение при загрузке Casper-SC Помощь студентам 7 05.07.2007 03:16