чтение из файла снизу вверх

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

чтение из файла снизу вверх

Сообщение itwork » 25.03.2007 14:04:55

ВОт этот отрывок кода - чтение файла с верху вниз:
Код: Выделить всё
    assign(f,'a.txt');
    reset(f);
    while not eof(f) do
    begin
    readln(f,tmp);
    writeln(tmp);
    end;
    close(f);


Люди а как написать код, чтоб наоборот происходило чтение файла снизу вверх???
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение GrayEddy » 25.03.2007 21:41:59

Как вариант, работа с TStringList.

var
T: TStringList;
I: Integer;
...
T := TStringList.Create;
T.LoadFromFile('d:\demo.txt');
for I := T.Count - 1 downto 0 do
Writeln(T.Strings[I]);
T.Free;
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение Attid » 26.03.2007 11:42:34

если строки одной длины то можно так :
Код: Выделить всё
var FileStream : TFileStream;
    Buffer: PChar;
    Size,vNum: integer;
begin
  FileStream := TFileStream.Create('c:\test.txt',fmOpenRead);
  Size:=10; // должен быть равен строке, незабываем про #13#10

  GetMem(Buffer, Size);

  for vNum := (FileStream.Size div Size)-1 downto 0 do // возможно нужно не div а округление до большего
  begin
   FileStream.Seek(vNum*Size,soFromBeginning);
   FileStream.Read(Buffer[0], Size);
   ShowMessage(Buffer);
  end;
 
  FreeMem(Buffer);
  FileStream.Free;
end;
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: чтение из файла снизу вверх

Сообщение AShen » 26.03.2007 13:33:30

itwork писал(а):ВОт этот отрывок кода - чтение файла с верху вниз:
Код: Выделить всё
    assign(f,'a.txt');
    reset(f);
    while not eof(f) do
    begin
    readln(f,tmp);
    writeln(tmp);
    end;
    close(f);


Люди а как написать код, чтоб наоборот происходило чтение файла снизу вверх???


В TP/BP есть подпрограмма seek(), позволяющая переходить по файлу на любую N-ую запись, при открытие файла для прямого, а не последовательного доступа. Т.е. открываешь файл на прямой доступ. Устанавливаешь указатель на последнюю запись. А потом читаешь в цикле уменьшая № читаемой записи. А есть ли такое в fpc я не подскажу. Если исходить из того, что fpc совместим по коду с TP/BP то можно попробывать ... ;)
Аватара пользователя
AShen
постоялец
 
Сообщения: 155
Зарегистрирован: 26.08.2005 10:22:44
Откуда: Новороссийск

Сообщение Attid » 26.03.2007 14:39:55

seek()
есть, но алгоритм такой-же как и с FileStream я описал.
опять же или строки должны быть одной длины или читать побайтно пока не наткнешься на символ конца строки и считать все что после и есть строка.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение itwork » 27.03.2007 18:33:48

GrayEddy писал(а):Как вариант, работа с TStringList.

var
T: TStringList;
I: Integer;
...
T := TStringList.Create;
T.LoadFromFile('d:\demo.txt');
for I := T.Count - 1 downto 0 do
Writeln(T.Strings[I]);
T.Free;


Люди где можна почитать про этот tsringlist или посмотреть примеры, а то чёт ничего неполучаетчя :( ?????
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение Attid » 27.03.2007 22:28:32

Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Replicator » 29.03.2007 13:38:24

Документация идет в комплекте с FPC, вообще-то. Там все очень подробно и понятно.
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Сообщение ZerstoreN » 30.03.2007 16:44:37

если длина файла не превышает глубину стека то можно так :
Код: Выделить всё
function fu( var f: text );
var s: string;
begin
if not eof(f) then
  begin
  readln( f, s);
  fu( f );
  writeln( s);
  end;
end;

но это уже так, клоунада, извините :)))
насчет документации - не скажите, инфа по юниту сокетс например вообще не соответствует действительности
ZerstoreN
новенький
 
Сообщения: 53
Зарегистрирован: 30.06.2006 12:05:01

Сообщение y_m » 11.11.2007 21:53:26

один и тот же код:
OrderFile:=TStringList.Create;
OrderFile.LoadFromFile('Order.dat');

под виндой нормально отрабатывает, а под линухом выдает sigmentation fault, в чем дело? как с этим бороться?

fpc 2/2/0
y_m
незнакомец
 
Сообщения: 4
Зарегистрирован: 10.11.2007 16:00:25

Сообщение alexs » 12.11.2007 10:00:23

может всё дело в символе конца строки? (#13#10 и #10)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение y_m » 12.11.2007 10:35:07

То же самое происходит и при загрузке файла созданного в ИДЕ fpc, хотя может там тоже <LF><CR>
y_m
незнакомец
 
Сообщения: 4
Зарегистрирован: 10.11.2007 16:00:25

Сообщение nagash » 12.11.2007 14:01:02

ну если пользоваться оригинальным паскалевским синтаксисом, то можно написать нечто вроде этого
Код: Выделить всё
i:=0;
k:=0;
assign(f,'a.txt');
reset(f);
while not eof(f) do
  begin
    readln;
    i:=i+1; {считаем строки}
  end;
while i > 0 do
  begin
    repeat
      begin
        readln(a[i]); {пишем данные в массив}
        {то бишь пишем и пишем и пишем пока не дойдем до нужной строки}
        k:=k+1;
      end;
    until k=i;
    i:=i-1;
   k:=0;
  end;
close(f);


Разумеется для больших программ это не выгодно и очень тормознуто, но на школьном уровне сойдет :)
nagash
новенький
 
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru