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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 00:21   #1
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
Восклицание динамический список и текстовый файл

Код:
program курсовая;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

//односвязный список
Type
 p=^elem;
 elem = record
        data:string;
        sled:p;
        end;

 //считывание файлы в динамический список
 Function read (var ykaz:p):p;
  var next:p;
      F:textfile;
  begin
   Assign(F,'text.txt');
   Reset(F);
   new(ykaz);
   readln(F,ykaz^.data);
   new(ykaz^.sled);
   next:=ykaz^.sled;
   while (not EoF(F) ) do
    begin
     readln(F,next^.data);
     new(next^.sled);
     next:=next^.sled;
    end;
   close(F);
  end;

 Procedure write(var ykaz:p);
  var F:textfile;
  begin
   Assign(F,'text.txt');
   Rewrite(F);
   while (ykaz<>nil) and (ykaz^.sled<>nil) do
    begin
     Writeln(F,ykaz^.data);
     ykaz:=ykaz^.sled;
    end;
   close(F);
  end;

var ykaz:p;

begin
 ykaz:=read(ykaz);
 write(ykaz);
end.
Две процедуры: первая читает из файла строки в динамический список, вторая записывает всё обратно. Я сделаю потом третью процедуру работы с самими строками, но это не главное.
Главное: не работает запись!
Form_13 вне форума Ответить с цитированием
Старый 20.12.2011, 06:15   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Используйте тип file of <тип данных>, например вашей записи. Текстовые файлы тут не уместны.
Код записи лучше так:
Код:
Type
  p=^elem;
  elem = record
    data:string[255];
    sled:p;
  end;
...
Procedure write(var ykaz:p);
var
  F:file of elem;
begin
try
  Assign(F,'text.bin');
  Rewrite(F);
  while ykaz<>nil do
  begin
    Write(F,ykaz^);
    ykaz:=ykaz^.sled;
  end;
finally
   closefile(F);
end;
Хотя зачем записывать в файл указатель на следующую запись, непонятно. При следующем чтении он все равно будет невалидным.
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 20.12.2011 в 06:19.
3D Hunter вне форума Ответить с цитированием
Старый 20.12.2011, 07:57   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Если сделать так, то и пишет, и читает.
Код:
type
  p=^elem;
  elem = record
    data:string;
    sled:p;
  end;

var ykaz:p;

procedure read;
var next:p;
    F:textfile;
begin
  Assign(F,'text.txt');
  Reset(F);
  next := ykaz;
  while not EoF(F) do begin
    readln(F, next^.data);
    new(next^.sled);
    next := next^.sled;
  end;
  close(F);
end;

procedure write;
var F:textfile;
  yk:p;
begin
  Assign(F,'text.txt');
  Rewrite(F);
  yk := ykaz;
  while (yk<>nil) and (yk^.sled<>nil) do begin
    Writeln(F,yk^.data);
    yk:=yk^.sled;
  end;
  close(F);
end;

begin
  new(ykaz);
  read;
  write;
end.
Почему-то в коде нет освобождения памяти (процедура Dispose).
Прик вне форума Ответить с цитированием
Старый 20.12.2011, 10:02   #4
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

1. Почему ты в процедуры не посылаешь файл? Всё время используешь глобальный указатель и не паришься?)
2. Смысл в процедуре записи делать локальный указатель? Неужели нельзя записывать через тот самый глобальный? Он же потом не потребуется.
Form_13 вне форума Ответить с цитированием
Старый 20.12.2011, 10:06   #5
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Код:
Program курсовая;

{$APPTYPE CONSOLE}

{$R *.res}

 Uses
  System.SysUtils;

//односвязный список
 Type
  p=^elem;
  elem = record
         data:string;
         sled:p;
         end;
 Var ykaz:p;
     flag:boolean;

 //считывание файлы в динамический список
 Procedure read;
  var next:p;
      F:textfile;
  begin
   Assign(F,'text.txt');
   Reset(F);
   next:=ykaz;
   while not EoF(F)  do
    begin
     readln(F,next^.data);
     if next^.data='' then
      begin
       flag:=true;
       break;
      end;
     new(next^.sled);
     next:=next^.sled;
    end;
   close(F);
  end;

 Procedure write;
  var F:textfile;
      yk:p;
  begin
   if flag then exit;
   Assign(F,'text.txt');
   Rewrite(F);
   yk:=ykaz;
   while (yk<>nil) and (yk^.sled<>nil) do
    begin
     Writeln(F,yk^.data);
     yk:=yk^.sled;
    end;
   close(F);
  end;


begin
 new(ykaz);
 read;
 write;
end.
Вот так переделал, спасибо. Ошибка была, потому что текстовый файл был пустой, я теперь сделал на это проверку.

Последний раз редактировалось Form_13; 20.12.2011 в 10:29.
Form_13 вне форума Ответить с цитированием
Старый 20.12.2011, 10:38   #6
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Единственный вопрос, в каком месте должен быть dispose? Как нам уничтожить указатель, чтобы сзади него ничего не осталось? После того, как перешли?
Form_13 вне форума Ответить с цитированием
Старый 20.12.2011, 11:17   #7
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
Сообщение от Form_13 Посмотреть сообщение
Единственный вопрос, в каком месте должен быть dispose?
Код:
var
  l, lp : p;

begin
  new(ykaz);
  read;
  write;

  lp := ykaz^.sled;
  while lp <> nil do begin
    l := lp^.sled;
    Dispose(lp);
    lp := l;
  end;
  Dispose(ykaz);
end.
Цитата:
Сообщение от Form_13 Посмотреть сообщение
Как нам уничтожить указатель, чтобы сзади него ничего не осталось? После того, как перешли?
Это уже второй вопрос
Непонятно что значит "перешли".
Прик вне форума Ответить с цитированием
Старый 20.12.2011, 11:33   #8
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Перешли, значит присвоили текущему указателю адресс следущего по списку элемента.
Код:
Procedure write;
  var F:textfile;
      yk,l:p;
  begin
   if flag then exit;                    //если мы выяснили при чтении, что файл пустой, выходим из подпрограммы
   Assign(F,'text.txt');
   Rewrite(F);
   yk:=ykaz;
   while (yk<>nil) do   //если текущий указатель имеет непустое значение, то..
    begin
     Writeln(F,yk^.data);     //записываем в файл строку, и ..
     l:=yk^.sled;
     dispose(yk);       //уничтожаем текущий элемент списка
     yk:=l;            //переходим на следущий указатель
    end;
   Dispose(ykaz);
   close(F);                  //закрываем файл.
  end;
ведь последний Dispose(ykaz); лишний по идее.

Последний раз редактировалось Form_13; 20.12.2011 в 11:41.
Form_13 вне форума Ответить с цитированием
Старый 20.12.2011, 11:44   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Уничтожается. Как показано освобождение указателей при записи в файл, то уничтожается. И после цикла Dispose еще раз вызывать не надо.
Сам же записал: "//уничтожаем текущий элемент списка"!!!
Так что, сколько их было, столько в цикле и грохнули.

Получается, что ты нашел более оптимальный код, чем я

Последний раз редактировалось Прик; 20.12.2011 в 11:47. Причина: Какой молодец ТС
Прик вне форума Ответить с цитированием
Старый 20.12.2011, 11:50   #10
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Угу) Посмотри все же вторую тему.
Form_13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический список Sergey240892 Помощь студентам 7 18.04.2011 20:34
Как вывести список файлов в текстовый файл assch Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 20.12.2010 22:36
Динамический список в С серг Общие вопросы C/C++ 9 11.03.2010 13:39
Сохранить список файлов и папок в определённой директории в текстовый файл Az@zel Помощь студентам 5 10.03.2010 20:41
Текстовый файл в текстовый массив Kimimaru Общие вопросы C/C++ 1 02.12.2007 11:55