Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Текстовые файлы

Автор: Rudolf 17.05.2006 12:16

Задача:''Дан текстовый файл f. Записать в файл g с сохоанением порядка следования те символы файла f которым в этом файле предшествует буква b ''. Алгоритм нормальный придумать немогу.Ведь для текстовых файлов не действует процедура SEEK..Написал только для одной буквы.

Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}
var f,g:textfile;
    i,j,k:integer;
    ch:char;
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.SaveToFile('c:\f.txt');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
memo2.Lines.LoadFromFile('c:\g.txt');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
k:=0;
AssignFile(f,'c:\f.txt');
AssignFile(g,'c:\g.txt');
reset(f);
rewrite(g);
While not EOF(f) do begin
read(f,ch);
inc(k);
if ch='b' then begin
reset(f);
while i<>k do begin
inc(i);
read(f,ch);
if i=k-1 then write(g,ch);
end;
end;
end;
CloseFile(f);
CloseFile(g);
end;

end.

Автор: Malice 17.05.2006 13:24

Нужно сохранять предыдущий считанный символ в отдельной переменной, и если текущий ="b", то записать его в файл.

repeat
Read (f,b);
if b='b' then write (g, p);
p:=b;
until eof(f);

правда, символ 'b' может оказаться первым, эту ситуацию тоже можно предусмотреть.

Автор: Rudolf 17.05.2006 13:58

Malice спасибо тебе...А если мы будем читать не символы а строки т.е.

Код
procedure TForm1.Button2Click(Sender: TObject);
begin
k:=0;
AssignFile(f,'c:\f.txt');
AssignFile(g,'c:\g.txt');
reset(f);
rewrite(g);
While not EOF(f) do begin
readln(f,s);
for i:=1 to length(s) do begin
if (s[i]='b') and (i<>1) then write(g,s[i-1]);
end;
end;
CloseFile(f);
CloseFile(g);
end;

Так можно???

Автор: volvo 17.05.2006 15:32

Rudolf,
а если файл будет таким:

Цитата(Пример)
aaaabaa<Enter>
baaaaacb
?
Выделенному символу не предшествует 'a' или символ переноса строки? Если "нет", то твое решение подойдет, а если "да", то ты уже потеряешь некоторые символы...

Автор: Rudolf 17.05.2006 23:28

А можете подсказать какие условия надо наложить чтобы избежать потери символов??Я попробовал но не совсем работает...

Код

procedure TForm1.Button2Click(Sender: TObject);
begin
k:=0;
AssignFile(f,'c:\f.txt');
AssignFile(g,'c:\g.txt');
reset(f);
rewrite(g);
While not EOF(f) do begin
inc(k);
readln(f,s);
for i:=1 to length(s) do begin
if i=length(s) then ch:=s[i];
if (s[i]='b') and (k<>1) and (i=1) then write(g,ch);
if (s[i]='b') and (i<>1) then write(g,s[i-1]);
end;
end;
CloseFile(f);
CloseFile(g);
end;

Автор: volvo 17.05.2006 23:47

procedure TForm1.Button2Click(Sender: TObject);
begin
ch := #0;
AssignFile(f,'f1.txt'); reset(f);
AssignFile(g,'g1.txt'); rewrite(g);

While not EOF(f) do begin
readln(f, s);
if (ch <> #0) and (s[1] = 'b') then write(g, ch);
ch := s[length(s)];

for i := 2 to length(s) do begin
if s[i] = 'b' then write(g, s[i - 1]);
end;
end;
CloseFile(f);
CloseFile(g);
end.

Пойдет?

Автор: Rudolf 18.05.2006 0:02

Да, пойдет good.gif Спасибо большое...но только наверное понадобится еще одно условие в случае когда у нас подряд идет два 'b'... ну это я еще посмотрю..Спасибо еще раз.

Автор: volvo 18.05.2006 0:08

Цитата(Rudolf @ 17.05.2006 20:02)
только наверное понадобится еще одно условие в случае когда у нас подряд идет два 'b'...
no1.gif Никаких дополнительных условий не понадобится... Все, что нужно уже есть... Теперь любая комбинация должна обрабатываться. Двойной 'b' я проверял, кстати smile.gif ...

Автор: Rudolf 18.05.2006 0:26

Тогда еще бо'льшее СПАСИБО smile.gif

Автор: мисс_граффити 20.05.2006 20:56

Цитата(Rudolf @ 17.05.2006 8:16) *

Задача:''Дан текстовый файл f. Записать в файл g с сохоанением порядка следования те символы файла f которым в этом файле предшествует буква b ''.

обратите внимание: не которые предшествуют b, а которым.
то есть для комбинации abc это будет с.

Автор: Malice 20.05.2006 21:43

Цитата(мисс_граффити @ 20.05.2006 16:56) *

обратите внимание: не которые предшествуют b, а которым.
то есть для комбинации abc это будет с.

smile.gif Точно, блин. Тогда, конечно, все еще проще, но вся работа на смарку.