Дан текстовый файл. В нем кроме обычных символов встречается команда \ins NN xx...xxx, где NN-двузначное число, xx...xxx - строка. Команда должна вставлять строку xx...xxx в данное место (нумерация строк с единицы). Запись результат во второй файл. Не понимаю как копировать строку во второй файл Вот,что написал я:
uses crt; var f1,f2:text; i,n:integer; str:string; begin clrscr; Assign(f1,'1.txt'); Reset(f1); Assign(f2,'2.txt'); Rewrite(f2); n:=0; While not EOF(f1) do begin readln(f1,str); i:=0; While (i<>Length(str)) do begin inc(i); if (str[i]='\') and (i+6<=Length(str)) then begin if (copy(str,i+1,4)='ins ')and(str[i+5] in ['0'..'9'])and (str[i+6] in ['0'..'9']) then begin i:=i+6; inc(n); write(f2,n); end; end else write(f2,str[i]); end; writeln(f2); end; close(f1); close(f2); readkey; end.
Помогите))В общем нужно взять строку после \ins NN и копировать её во второй файл в NN-ную строку
off
20.04.2008 21:58
Спасите,пожалуйстааа.Послезавтра последний срок!!
klem4
21.04.2008 1:52
Ты бы поточнее задание привел и текст - пример входного файла...
Вот такое допустимо ?
Цитата
пертва\insястрока во вотой нету второго параметра для ins \ins 42 а вот третья нормальная ? \ins 12 qwerty! \ins 32 string!
просто надо ж знать насколько сложный парсер должен быть ...
то,что после \ins 11,нужно копировать во второй файл в 11 строку; то,что после \ns 13,копировать во второй файл в 13 строку и т.д. то,что после \ns 2 вообще не нужно ,т.к. рассматриваются только двузначные числа... не знаю как ещё объяснить))
klem4
21.04.2008 14:07
в общем так, формат команды такой:
<{пробел | начало строки}>\ins <пробел><двузначное число><пробел><текст до конца строки>
верно ?
off
21.04.2008 14:26
ну что то типа того.и вот этот <текст до конца строки> нужно копировать во второй файл(заранее пустой) в строку под номером <двузначное число>
klem4
24.04.2008 19:50
если еще актуально, вот держи:
{$B-} function StrToByte(const s: string): byte; var value, err: integer; begin val(s, value, err); StrToByte := value; end;
constructor CommandList.Create; begin first := nil; end;
destructor CommandList.Free; var pCmd: PCommand; begin while first <> nil do begin pCmd := first; first := first^.nextCmd; pCmd^.Free; dispose(pCmd); end; end;
procedure CommandList.Add(const pos: integer; const message: string); var pCmd, pFirst, pred: PCommand; begin new(pCmd, Create(pos, message));
if first = nil then first := pCmd else begin
pFirst := first; pred := nil;
while (pFirst <> nil) and (pos > pFirst^.pos) do begin pred := pFirst; pFirst := pFirst^.nextCmd; end;
if pFirst = nil then pred^.nextCmd := pCmd else if pred = nil then begin pCmd^.nextCmd := first; first := pCmd end else begin pred^.nextCmd := pCmd; pCmd^.nextCmd := pFirst; end; end; end;
procedure CommandList.Execute(const fileName: string); var f: Text; pFirst: PCommand; filePos: integer; begin assign(f, fileName); rewrite(f);
pFirst := first;
filePos := 0; while pFirst <> nil do begin while filePos <> pFirst^.pos - 1do begin writeln(f, ''); inc(filePos); end; writeln(f, pFirst^.msg); inc(filePos); pFirst := pFirst^.nextCmd; end;
close(f); end;
type Parser = object constructor Create; destructor Free;
function IsCommand(const s: string; const p: byte; var _pos: byte; var msg: string): boolean;
function Parser.IsCommand(const s: string; const p: byte; var _pos: byte; var msg: string): boolean; begin if (p + 8 <= length(s)) and (s[ p + 4 ] = ' ') and (s[ p + 5] in ['0'..'9']) and (s[ p + 6] in ['0'..'9']) and (s[ p + 7] = ' ') and ( ( p = 1) or (s[ p - 1 ] = ' ')) then begin
_pos := StrToByte(copy(s, p + 5, 2)); msg := copy(s, p + 8, 255); IsCommand := true;
if IOResult <> 0 then begin writeln('Can''t open file "', cmdFileName, '"'); readln; halt(1); end;
new(cmdList, Create);
while not eof ( cmdFile ) do begin readln(cmdFile, s);
p := 1; cmdFind := false;
repeat p := pos('\ins', copy(s, p, 255));
if p > 0 then begin cmdFind := IsCommand(s, p, _pos, msg);
if cmdFind then cmdList^.Add(_pos, msg);
inc(p, 4); end; until (p = 0) or (cmdFind) end;
cmdList^.Execute(outFileName);
dispose(cmdList, Free);
close(cmdFile); end;
var pr: ^Parser;
begin new(pr, Create); pr^.Parse('c:\commands.txt', 'c:\result.txt'); dispose(pr, Free); end.
Цитата(COMMANDS.TXT)
\ins 123 pqweqweqweqweqwe qweqweqwe\ins eqweq 03 213 \ins 01 THIS IS FIRST STRING \ins 03 THIS IS THIRD STRING qweo fhuiqhwof\ins 32 fqwe \ins 04 THIS IS FOURS STRING \ins 05 5555
Цитата(RESULT.TXT)
THIS IS FIRST STRING
THIS IS THIRD STRING THIS IS FOURS STRING \ins 05 5555
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.