Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 15.09.2009, 19:19   #1
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость Динамический массив

Задача такова:Создать динамический массив, записать его в файл, потом считать его с файла и вывести в мемо...
Код:
program Project2;
{$APPTYPE CONSOLE}

uses
  SysUtils,math;


type
  Dysc=record
     KodCycl:integer;
     NazvCycl:string[80];
     ObsCyclCred:real;
     KilkDyscCycl:integer;
     KursRob:boolean;
  end;
  Mas=array of Dysc;

 const
  N=7;
var
  G       :Mas;
  P       :Dysc;
  I, J    :integer;
  RecFile: file of Dysc;




begin

  SetLength(G,N);

  G[0].KodCycl:=1; G[0].NazvCycl:='Gumanitarni & social`no-economi4ni disciplini ';  G[0].ObsCyclCred:=23.0; G[0].KilkDyscCycl:=15; G[0].KursRob:=false;
  G[1].KodCycl:=7; G[1].NazvCycl:='Disciplini ta dodatkovi platni poslugi ';  G[1].ObsCyclCred:=4.0; G[1].KilkDyscCycl:=2; G[1].KursRob:=false;
  G[2].KodCycl:=2; G[2].NazvCycl:='Fundamental`ni disciplini ';  G[2].ObsCyclCred:=26.0; G[2].KilkDyscCycl:=7; G[2].KursRob:=true;
  G[3].KodCycl:=3; G[3].NazvCycl:='Normativni prof-orientovani disciplini ';  G[3].ObsCyclCred:=34.0; G[3].KilkDyscCycl:=16; G[3].KursRob:=true;
  G[4].KodCycl:=5; G[4].NazvCycl:='Vibirkovi p-o samostiynogo viboru VNZ ';  G[4].ObsCyclCred:=26; G[4].KilkDyscCycl:=12; G[4].KursRob:=true;
  G[5].KodCycl:=4; G[5].NazvCycl:='Vibirkovi p-o disciplini za perelikom ';  G[5].ObsCyclCred:=14; G[5].KilkDyscCycl:=6; G[5].KursRob:=false;
  G[6].KodCycl:=8; G[6].NazvCycl:='Disciplini naglyadovoi radu ';  G[6].ObsCyclCred:=2; G[6].KilkDyscCycl:=1; G[6].KursRob:=false;

  AssignFile(RecFile, 'MYREC.txt');
  ReWrite(RecFile);
  for i := 0 to n do
  begin
    Write(RecFile, G[i]);
      end;
 // CloseFile(RecFile);

  i:=0;

 while not eof(RecFile) do

  begin

 memo1.lines.add(  Текст из файла );                          
  end;



end.
Подскажите как я могу записать норм в файл(прикрепленный рис)
Хотел бы что бы так записало в файл и так же вывело в мемо...
Код:
1 Gumanitarni & social`no-economi4ni disciplini   23.0   15  false
                      ...............
Изображения
Тип файла: jpg Безымянный.jpg (8.2 Кб, 134 просмотров)

Последний раз редактировалось Lemo; 15.09.2009 в 19:38.
Lemo вне форума Ответить с цитированием
Старый 15.09.2009, 19:55   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Lemo А что конкретно тебя не устраивает в таком варианте, как у тебя? Мне кажется, что этот код работает корректно. Ой, ой, на ты его для чтения повторно открываешь после сохранения, я надеюсь?
mMAg вне форума Ответить с цитированием
Старый 15.09.2009, 19:57   #3
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

Записывает в файл не коректно (рисунок же прикрепил)
Lemo вне форума Ответить с цитированием
Старый 15.09.2009, 20:12   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Записывает в файл не коректно (рисунок же прикрепил)
С чего это ты взял, что файл некорректно записывается? Ты с него считывать пытался? Заполняет твою запись корректно?
Что-то мне подсказывает, что для получения корректного отображения файла в блокноте вам нужно использовать не типизированный, а текстовый файл.
mMAg вне форума Ответить с цитированием
Старый 15.09.2009, 21:41   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Вроде что то такое:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,math, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  N=7;

type
  Dysc=record
     KodCycl:integer;
     NazvCycl:string[100];
     ObsCyclCred:real;
     KilkDyscCycl:integer;
     KursRob:boolean;
  end;


var
  Form1: TForm1;

var
  G       : array of Dysc;
  i       :integer;
  RecFile: file of Dysc;

implementation

{$R *.dfm}

//Запись
procedure TForm1.Button1Click(Sender: TObject);
begin
SetLength(G,N);
  G[0].KodCycl:=1; G[0].NazvCycl:='Gumanitarni & social`no-economi4ni disciplini ';  G[0].ObsCyclCred:=23.0; G[0].KilkDyscCycl:=15; G[0].KursRob:=false;
  G[1].KodCycl:=7; G[1].NazvCycl:='Disciplini ta dodatkovi platni poslugi ';  G[1].ObsCyclCred:=4.0; G[1].KilkDyscCycl:=2; G[1].KursRob:=false;
  G[2].KodCycl:=2; G[2].NazvCycl:='Fundamental`ni disciplini ';  G[2].ObsCyclCred:=26.0; G[2].KilkDyscCycl:=7; G[2].KursRob:=true;
  G[3].KodCycl:=3; G[3].NazvCycl:='Normativni prof-orientovani disciplini ';  G[3].ObsCyclCred:=34.0; G[3].KilkDyscCycl:=16; G[3].KursRob:=true;
  G[4].KodCycl:=5; G[4].NazvCycl:='Vibirkovi p-o samostiynogo viboru VNZ ';  G[4].ObsCyclCred:=26; G[4].KilkDyscCycl:=12; G[4].KursRob:=true;
  G[5].KodCycl:=4; G[5].NazvCycl:='Vibirkovi p-o disciplini za perelikom ';  G[5].ObsCyclCred:=14; G[5].KilkDyscCycl:=6; G[5].KursRob:=false;
  G[6].KodCycl:=8; G[6].NazvCycl:='Disciplini naglyadovoi radu ';  G[6].ObsCyclCred:=2; G[6].KilkDyscCycl:=1; G[6].KursRob:=false;

AssignFile(RecFile,'C:\\111.txt');
rewrite(RecFile);
for i:=0 to n-1 do
  Write(RecFile,G[i]);
CloseFile(RecFile);


end;

//Чтение
procedure TForm1.Button2Click(Sender: TObject);
begin
SetLength(G,N);
AssignFile(RecFile,'C:\\111.txt');
reset(RecFile);
for i:=0 to n-1 do
  Read(RecFile,G[i]);

//Выводим значения только 0-й (тобиш 1-й) записи из массива. Для остального можно сделать цикл
Memo1.Lines.Add(IntToStr(G[0].KodCycl));
Memo1.Lines.Add(G[0].NazvCycl);
Memo1.Lines.Add(FloatToStr(G[0].ObsCyclCred));
Memo1.Lines.Add(IntToStr(G[0].KilkDyscCycl));
Memo1.Lines.Add(BoolToStr(G[0].KursRob,true));
CloseFile(RecFile);
end;

end.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 15.09.2009 в 21:44.
spamer вне форума Ответить с цитированием
Старый 16.09.2009, 05:26   #6
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
Подмигивание Откуда же все это берется...

Цитата:
Сообщение от Lemo Посмотреть сообщение
Записывает в файл не коректно (рисунок же прикрепил)
Дело в том, что вы используете типизированный файл, а в качестве типа используете запись. Т.е. файл ваш - последовательность записей Dysc.
Каждая подобная запись использует определенное количество места на жестком диске/памяти, а если быть точнее - ее составляющие.
Код:
  KodCycl:integer; - 4 байта
  NazvCycl:string[100]; - 101 байт
  ObsCyclCred:real; - 8 байт 
  KilkDyscCycl:integer; - 4 байта
  KursRob:boolean; - 1 байт
NazvCycl:string[100]; - 101 байт???? Почему 101, спросите вы? Да, именно 101, т.к. при работе со строками мы совсем забываем, что строка это набор символов, а иными словами - array of char. Дак вот когда мы объявляем переменную string[100], компилятор воспринимает это как array [0..100] of char. 101 элемент * размер char (1 байт) = 101 байт.
Итого, ваша запись использует 118 байт памяти. Физически используется 128 байт: +7 нулевых байт после строки - на самом деле компилятор выделяет под строку такое количество байт, при котором бы она заканчивалась на любом восьмом байте (0F,17,586F)
Т.е
Код:
размер_строки := размер_строки + ((байт_начала_строки + размер_строки -1) mod 8)
+ 3 байта окончания записи - аналогичная строкам ситуация.
Код:
if (размер_записи mod 8) <> 0 then размер_записи := размер_записи + 8 - (размер_записи mod 8)
Почему же так? Честно - не могу сказать, думаю дело в чтении/объявлении на низком уровне - это лучше спросить у наших асмеров.. =))
Далее по теме: для того, чтобы любая запись могла быть корректно изменена - она занимает максимальное количество байт в файле, который вы создаете - 128 в нашем случае. Все данные идут последовательно: сначала 4 байта KodCycl, после 108 байт NazvCycl, после 8 байт ObsCyclCred... Думаю, принцип понятен: компилятор записывает байты - оттого такая визуальная читабельность текста, однако машинная читаемость прелестная. ))
А если уж вам необходимо, чтобы текст был читабелен и визуально, ну что ж - записывайте данные в текстовый файл при том текстом (что значительно увеличит размеры файла - в нашем случае для строки используется 108(!!!) байт из 128), как вам предложил mMag. Используйте байт-сепараторы, к примеру, и делайте запись и чтение/парсинг каждой строки своими силами. Только вопрос: А оно вам надо? Код-то работает. =)))
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось SuperVisor; 16.09.2009 в 07:15. Причина: Так, матчастью страдал.. ))))
SuperVisor вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив Ivin Мультимедиа в Delphi 14 27.02.2009 23:22
динамический массив Dimon Паскаль, Turbo Pascal, PascalABC.NET 3 21.03.2008 18:08
Динамический массив _ares_ Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2007 23:54
динамический массив Diller Помощь студентам 48 07.10.2007 15:43
Динамический массив Mickle Общие вопросы Delphi 8 19.06.2007 05:45


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя