Задача:''Дан текстовый файл f. Записать в файл g с сохоанением порядка следования те символы файла f которым в этом файле предшествует буква b ''. Алгоритм нормальный придумать немогу.Ведь для текстовых файлов не действует процедура SEEK..Написал только для одной буквы.
{$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;
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
Да, пойдет Спасибо большое...но только наверное понадобится еще одно условие в случае когда у нас подряд идет два 'b'... ну это я еще посмотрю..Спасибо еще раз.
Автор: volvo 18.05.2006 0:08
Цитата(Rudolf @ 17.05.2006 20:02)
только наверное понадобится еще одно условие в случае когда у нас подряд идет два 'b'...
Никаких дополнительных условий не понадобится... Все, что нужно уже есть... Теперь любая комбинация должна обрабатываться. Двойной 'b' я проверял, кстати ...
Автор: Rudolf 18.05.2006 0:26
Тогда еще бо'льшее СПАСИБО
Автор: мисс_граффити 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 это будет с.
Точно, блин. Тогда, конечно, все еще проще, но вся работа на смарку.