элементы в типизированном файле

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

21 янв 2014, 20:31

задача стоит в следующем: нужно не используя оператора seek вставить в типизированный файл вставить любые элементы на начало файла и в середину. но обязательно без seek. была мысль как-то через pos и insert, но не доганяю как это сделать. пожалуйста обьясните
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

22 янв 2014, 01:41

Если открыть файл в режиме изменения (чтения и записи), то seek(x) — это reset (прыжок в начало), а потом read (x-1) раз.
Read тоже двигает курсор
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

22 янв 2014, 01:50

Assign(f),'fail.dat');
Reset(f);
Writeln('vvedi dani');
Readln(тут типа считали);

Writeln('vvedi dani');
Readln(опять например считали);
//дальше что?
read(x-1); ??так я понял?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

22 янв 2014, 01:54

Так я не понял, файл у Вас типизированный или нет?
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

22 янв 2014, 01:57

да типизированный. было сказано сделать с seek и без него. я уже сделал с seek и понял что это именно типизированный файл.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

22 янв 2014, 02:00

Ну так свой пример с seek дайте. Не писать же мне всё с нуля!
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

22 янв 2014, 02:08

Код: Выделить всё

type
   dani=record
   stroka:string[45];
   cifra,b:real;
   end;
   var
      sh:dani;
      f:file of dani;
      d:dani;
      begin
 
      Assign(f , 'd:\test.dat');
      Rewrite(F);
      With  sh do begin
      writeln('vvedi stroky');
      readln(sh.stroka);
      Writeln('vvedi cifry');
      readln(sh.cifra);
        readln(d.b);
      end;
      Seek(f,0);
      Write(f,sh);
      seek(f,128);
      write(f,d);
      Close(F);
      End.
вот . извиняюсь
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

22 янв 2014, 02:34

Код: Выделить всё

type
   dani=record
   stroka:string[45];
   cifra,b:real;
   end;
   var
      sh:dani;
      f:file of dani;
      d:dani;
      i:integer;
begin

      Assign(f , 'c:\tmp\test.dat');
      Rewrite(F);
      With  sh do begin
      writeln('vvedi stroky');
      readln(sh.stroka);
      Writeln('vvedi cifry');
      readln(sh.cifra);
        readln(d.b);
      end;
      Seek(f,0);
      Write(f,sh);
      seek(f,128);
      write(f,d);
      Close(F);
      
      reset(f);
      read(f,d);
      writeln('Stroka:',d.stroka,'   cifra:',d.cifra,'   b:',d.b);
      for i:=0 to 127 do read(f,d);
      writeln('Stroka:',d.stroka,'   cifra:',d.cifra,'   b:',d.b);
      close(f);
End.
reset(f); — делает фактически Seek(f,0)

а

for i:=0 to 127 do read(f ,d) ; — это как раз замена Seek(f,128), но 127 здесь не абсолютная позиция, а +127 к позиции 1, после того, как одно чтение уже было выполнено
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

22 янв 2014, 02:54

благодарю вас
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

22 янв 2014, 04:16

но всеравно в программе встречаеться вашей seek ... ладно и на том спасибо
Ответить