Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение/запись типизированого файла, записываю, но не могу прочитать 
V
    Опции темы
Pentium02
Дата 10.12.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Значит так сам тип:
Код

type
  TCOLG = record
    Famil: string[100];
    Name: string[100];
    Otch: string[100];
    Group: string[100];
    HomePhone: string[100];
    MobilePhone1: string[100];
    MobilePhone2: string[100];
  end;


Пишу так:
Код

procedure TMainForm.N3Click(Sender: TObject);
var
COLG: TColg;
DataBaseFile: File of TColg;
begin
if SaveDialog1.Execute then
begin
AssignFile(DataBaseFile, SaveDialog1.FileName);
IF FileExists (SaveDialog1.FileName) then
  begin
   Reset(DatabAseFile);
  Seek(DataBaseFile, FileSize(DataBaseFile));
  end
  else
  ReWrite(DataBaseFile);

  try
    Write(DataBaseFile, colg);
  finally
    CloseFile(DataBaseFile);
  end;
end;

end;


Читаю так:
Код

procedure TMainForm.N2Click(Sender: TObject);
var
COLG: TColg;
DataBaseFile: File of TColg;
begin
if OpenDialog1.Execute then
begin
AssignFile(DataBaseFile, OpenDialog1.FileName);
Reset(DatabAseFile);
  try
    if EOF(DataBaseFile) then
      Read(DataBaseFile, Colg);
  finally
      CloseFile(DataBaseFile);
end;
with StudList.Items.Add do
begin
Caption:=Colg.Famil[0];
subitems.Add(colg.Name[0]);
subitems.Add(colg.Otch[0]);
subitems.Add(colg.Group[0]);
subitems.Add(colg.HomePhone[0]);
subitems.Add(colg.MobilePhone1[0]);
subitems.Add(colg.MobilePhone2[0]);
end;

end;

end;

При чтение получаются какието кракозябры. Первый раз работаю с типизироваными файлами. Что я не так делаю?
PM MAIL WWW ICQ   Вверх
Voyager
Дата 10.12.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 2
Всего: 18



Попробуй убрать "if EOF(DataBaseFile) then" (кстати зачем эта строчка тут?). И где перед "Write(DataBaseFile, colg);" ты инициализируешь colg? Вообще Write лучше заменить на BlockWrite.

Это сообщение отредактировал(а) Voyager - 10.12.2006, 15:12
PM   Вверх
Pentium02
Дата 10.12.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Зачем она хз, просто смотрел пример работы с типизироваными файлами, там пояснения к этому небыло.
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 10.12.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Voyager @  10.12.2006,  15:10 Найти цитируемый пост)
Попробуй убрать "if EOF(DataBaseFile) then" (кстати зачем эта строчка тут?). 

Там в оригинале было наоборот if not EOF(DataBaseFile) then"


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Guedda
Дата 10.12.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Код

type
  TCOLG = record
    Famil: string[100];
    Name: string[100];
    Otch: string[100];
    Group: string[100];
    HomePhone: string[100];
    MobilePhone1: string[100];
    MobilePhone2: string[100];
  end;


Запись:
Код

var
  COLG: TColg;
  DataBaseFile: File of TColg;
begin
  if SaveDialog1.Execute then
  begin
    AssignFile(DataBaseFile, SaveDialog1.FileName);
  IF FileExists (SaveDialog1.FileName) then
  begin
    Reset(DatabAseFile);
    Seek(DataBaseFile, FileSize(DataBaseFile));
  end
  else
    ReWrite(DataBaseFile);
  try
    Write(DataBaseFile, colg);
  finally
    CloseFile(DataBaseFile);
  end;
end;


Чтение:
Код

var
  Colg : TColg;
  DataBaseFile : file of TColg;
begin
  AssignFile(DataBaseFile, OpenDialog1.FileName);
  Reset(DataBaseFile);
  while not eof(DataBaseFile) do begin
    Read(DataBaseFile, Colg);
    //Здесь делаешь всё, что необходимо сделать с этим типом... Допустим
    ShowMessage(Colg.Famil);
  end;
  CloseFile(DataBaseFile);
end;



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Pentium02
Дата 10.12.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



Спасибо!
PM MAIL WWW ICQ   Вверх
Paradise
Дата 10.12.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Попробуй так:
Код
type
    TPeople = record
           Name : string[20];
           : string[20];
           : integer;


Запись:
Код
var f : file of TPeople;
    peop : TPeople;

begin
     AssignFile( f, 'DB.db' );
     {$I-}
     Reset( f ); // открыть файл
     Seek( f, FileSize( f ) ); // указатель записи в конец файла
     {$1+}
     if IOResurt = 0
       then Write( peop ) 
       else 
           begin
                ShowMessage( 'Файл БД не найден!' );
                Exit
           end;
end;


Чтение:
Код
var f : file of TPeople;
    rec : TPeople;

begin
     AssignFile( f, 'DB.db' );
     {$I-}
     Reset( f ); // открыть файл
     {$1+}
     if IOResurt <> 0
       then 
           begin
                ShowMessage( 'Файл БД не найден!' );
                Exit;
           end; 
       else 
           begin
                while not EOF( f ) do
                     begin
                          read( f, rec );
                          Memo1.Lines.Add( rec );
                     end;
           end;     


Если IOResurt = 0, то файл найден иначе не найден.
Попробуй ( ожет быть где то ошибка ) smile 
PM MAIL   Вверх
Pentium02
Дата 12.12.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



2 ParadiseСпасибо большое!  кстате ошибка тут smile  :
У тебя так
Код

Write(peop) 

А надо
Код

Write(f, peop) 

 smile 
PM MAIL WWW ICQ   Вверх
burcev
Дата 11.3.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2008
Где: Украина

Репутация: нет
Всего: нет



Цитата(Pentium02 @ 10.12.2006,  14:44)
Значит так сам тип:
Код

type
  TCOLG = record
    Famil: string[100];
    Name: string[100];
    Otch: string[100];
    Group: string[100];
    HomePhone: string[100];
    MobilePhone1: string[100];
    MobilePhone2: string[100];
  end;


Пишу так:
Код

procedure TMainForm.N3Click(Sender: TObject);
var
COLG: TColg;
DataBaseFile: File of TColg;
begin
if SaveDialog1.Execute then
begin
AssignFile(DataBaseFile, SaveDialog1.FileName);
IF FileExists (SaveDialog1.FileName) then
  begin
   Reset(DatabAseFile);
  Seek(DataBaseFile, FileSize(DataBaseFile));
  end
  else
  ReWrite(DataBaseFile);

  try
    Write(DataBaseFile, colg);
  finally
    CloseFile(DataBaseFile);
  end;
end;

end;


Читаю так:
Код

procedure TMainForm.N2Click(Sender: TObject);
var
COLG: TColg;
DataBaseFile: File of TColg;
begin
if OpenDialog1.Execute then
begin
AssignFile(DataBaseFile, OpenDialog1.FileName);
Reset(DatabAseFile);
  try
    if EOF(DataBaseFile) then
      Read(DataBaseFile, Colg);
  finally
      CloseFile(DataBaseFile);
end;
with StudList.Items.Add do
begin
Caption:=Colg.Famil[0];
subitems.Add(colg.Name[0]);
subitems.Add(colg.Otch[0]);
subitems.Add(colg.Group[0]);
subitems.Add(colg.HomePhone[0]);
subitems.Add(colg.MobilePhone1[0]);
subitems.Add(colg.MobilePhone2[0]);
end;

end;

end;

При чтение получаются какието кракозябры. Первый раз работаю с типизироваными файлами. Что я не так делаю?

А от куда, ты считываешь данные для записи в файл.
У меня задание, мне нужно записать с Memo в типизированный файл типа запись.
Тип запись.
Код

  type
  TMyRec = record
  number_id: string[200];
  sName: string[50];
  name: string[50];
  lName: string[50];
  pol: string[50];
  klas: integer;
  data_press: string[50];
  end;


Вот я читаю типизированный файл.
Код

procedure TForm1.read_dataClick(Sender: TObject);
var fil: textfile;
a_1, a_2, a_3, a_4, a_5, a_6, a_7:string;
begin

if FileExists('pupil.school') then
  begin
  //++++++++++++++++++++++++++++++++++++++++++++++++++

  assignfile(f, 'pupil.school');
{$I-}
  reset(f);
 {$I-}
 if IOResult<>0 then
 begin
 ShowMessage('ERROR');
 Exit;
 end;
n:=0;
 Form1.writ_read_data.Clear;
while not EOF(f) do
begin
read(f, rec);
n:=n+1;

a_1:=rec.number_id;
a_2:=rec.sName;
a_3:=rec.name;
a_4:=rec.lName;
a_5:=rec.pol;
a_6:=inttostr(rec.klas);
a_7:=rec.data_press;

Form1.writ_read_data.Lines.Add(a_1);
Form1.writ_read_data.Lines.Add(a_2);
Form1.writ_read_data.Lines.Add(a_3);
Form1.writ_read_data.Lines.Add(a_4);
Form1.writ_read_data.Lines.Add(a_5);
Form1.writ_read_data.Lines.Add(a_6);
Form1.writ_read_data.Lines.Add(a_7);
end;


А записать обратно, с Memo в файл, - НЕ ПОЛУЧАЕТСЯ.
ПОМОГИТЕ, плиз.

Это сообщение отредактировал(а) burcev - 11.3.2008, 17:56
PM MAIL ICQ   Вверх
VICTAR
Дата 11.3.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Код

var fil: file of TMyRec;

PM MAIL   Вверх
burcev
Дата 11.3.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2008
Где: Украина

Репутация: нет
Всего: нет



Если можно с примером. smile

Добавлено через 3 минуты и 2 секунды
Цитата(VICTAR @ 11.3.2008,  18:09)
Код

var fil: file of TMyRec;

да, все правильно. Но я эту переменную не использую.
Чтение у меня работает, а вот запись . Я не знаю
PM MAIL ICQ   Вверх
VICTAR
Дата 11.3.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(burcev @  11.3.2008,  19:12 Найти цитируемый пост)
Чтение у меня работает, а вот запись . Я не знаю 

Показывай, что там не получается. 
У тебя массив TMyRec, я так понимаю?
PM MAIL   Вверх
burcev
Дата 11.3.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2008
Где: Украина

Репутация: нет
Всего: нет



Излагаю мою идею. Мы считываем с мемо по 7 строк и загоняем в тип запись, а запись в свою очередь записываем в файл. Может вы предложите, что-то по лучше и по проще .

Ну вот мое сохранение
Код

procedure TForm1.save_dataClick(Sender: TObject);
var j:integer;
begin
if MessageDlg('Сохранить данные?', mtConfirmation, [mbOk, mbCancel],0)<>mrOk
then exit
else begin
assignFile(f, 'pupil.school');
rewrite(f);
i:=1;
while i<Form1.writ_read_data.Lines.Count+1 do begin
  for j:=1 to 7 do begin
with rec do
begin
    number_id:=Form1.writ_read_data.Lines[j];
    sName:=Form1.writ_read_data.Lines[j+1];
    name:=Form1.writ_read_data.Lines[j+2];
    lName:=Form1.writ_read_data.Lines[j+3];
    pol:=Form1.writ_read_data.Lines[j+4];
    klas:=strtoint(Form1.writ_read_data.Lines[j+5]);
    data_press:=Form1.writ_read_data.Lines[j+6];
 
   end;
write(f, rec);
  end;
i:=i+7;
 end;
Closefile(f);

end;
end;


У меня выдает ошибку на этой строке
Код

data_press:=Form1.writ_read_data.Lines[j+6];
 
В смысле он не знает что это '11.03.2007'
с эдита считаваеются данные в мемо . например '11.03.2007'
data_press по сути это например (дата рождение)

Добавлено @ 22:02
По суте мне нужно разобраться с 9 по 26 строку. Что там не так. ПОМОГИТЕ smile 

Ах, да вот
Код

  type
  TMyRec = record
  number_id: string[200];
  sName: string[50];
  name: string[50];
  lName: string[50];
  pol: string[50];
  klas: integer;
  data_press: string[50];
  end;

var
  i,j:integer;
 f: file of TMyRec;
  rec: TMyRec;


Это сообщение отредактировал(а) burcev - 11.3.2008, 22:12
PM MAIL ICQ   Вверх
VICTAR
Дата 11.3.2008, 22:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Попробуй, вроде так. Я не проверял
Код

procedure TForm1.save_dataClick(Sender: TObject);
begin
  if MessageDlg('Сохранить данные?', mtConfirmation, [mbOk, mbCancel], 0) <> mrOk
    then
    exit
  else
  begin
    assignFile(f, 'pupil.school');
    rewrite(f);
    i := 0;
    while (i + 7) <= writ_read_data.Lines.Count do
    begin
      with rec do
      begin
        number_id := writ_read_data.Lines[i];
        sName := writ_read_data.Lines[i + 1];
        name := writ_read_data.Lines[i + 2];
        lName := writ_read_data.Lines[i + 3];
        pol := writ_read_data.Lines[i + 4];
        klas := StrToIntDef(writ_read_data.Lines[i + 5], 0);
        data_press := writ_read_data.Lines[i + 6];
      end;
      write(f, rec);
      inc(i, 7);
    end;
  end;
  Closefile(f);
end;


PM MAIL   Вверх
burcev
Дата 11.3.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2008
Где: Украина

Репутация: нет
Всего: нет



Цитата(VICTAR @ 11.3.2008,  22:40)
Попробуй, вроде так. Я не проверял
Код

procedure TForm1.save_dataClick(Sender: TObject);
begin
  if MessageDlg('Сохранить данные?', mtConfirmation, [mbOk, mbCancel], 0) <> mrOk
    then
    exit
  else
  begin
    assignFile(f, 'pupil.school');
    rewrite(f);
    i := 0;
    while (i + 7) <= writ_read_data.Lines.Count do
    begin
      with rec do
      begin
        number_id := writ_read_data.Lines[i];
        sName := writ_read_data.Lines[i + 1];
        name := writ_read_data.Lines[i + 2];
        lName := writ_read_data.Lines[i + 3];
        pol := writ_read_data.Lines[i + 4];
        klas := StrToIntDef(writ_read_data.Lines[i + 5], 0);
        data_press := writ_read_data.Lines[i + 6];
      end;
      write(f, rec);
      inc(i, 7);
    end;
  end;
  Closefile(f);
end;


БОЛЬШОЕ СПАСИБО.
ВСЕ РАБОТАЕТ.
от меня +1 в репутацию.

Блин, это нужно набрать 100 постов.
Ну все равно, когда наберу, - прореспечу.

Это сообщение отредактировал(а) burcev - 11.3.2008, 22:58
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0931 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.