![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запись в файл [D7, WinXP]
гость © (2004-12-26 12:25:00)Задача такая. есть строка в которой записана формула вида (5*sin(t)+7*sin(3t)+55*sin(7t)+..и т.д.). необходимо записать в файл 1.txt все числа перед знаком * в строку через пробел.
Mystic (2004-12-26 15:27:00) [1]Еще один вариант решения, с использование LEX:
1) Скачать http://www.torry.net/tools/developers/compilers/tplyh.zip
2) Создать файл test.l
%{
programTest;
{$APPTYPE CONSOLE}
usesClasses, LexLib;
%}
%%
%{
varI: Integer;
%}
[0-9]+\* begin
I := 1;
whileyytext[I] in['0'..'9'] do
begin
put_char(yytext[I]);
I := I + 1;
end;
put_char(' ');
end;
\n ;
. ;
%%
var
St: string;
begin
Write('St=');
ReadLn(St);
try
yyinput := TStringStream.Create(St);
yyoutput := TFileStream.Create('1.txt', fmCreate);
yylex;
finally
yyinput.Free;
yyoutput.Free;
end;
ReadLn;
end.
3) Выполнить следующие команды:
lex test.l test.dpr
dcc32 test.dpr -U<PATH to TPLYH>
Преимущества в более легкой модификации. Например, если будет вдруг сказано, что перед числом и знаком `*' могут быть необязательные пробелы, то нам надо только заменить выражение [0-9]+\*на [0-9]+" "*\*.
Также нетрудно при необходимости читать вещественные числа, учитывать знак, стоящий перед числом (возможноотделенный пробелом) и т. д.
begin...end (2004-12-26 14:39:00) [2]В [10] есть ошибка, нужно так:
var
sOld, sNew: String;
I, P: Integer;
F: TextFile;
begin
sOld := '(5*sin(t)+7*sin(3t)+55*sin(7t)+';
P := 0;
for I := 1 to Length(sOld) do
begin
case sOld[I] of
'0'..'9':
if P = 0 then P := I;
'*':
if P <> 0 then
begin
sNew := sNew + Copy(sOld, P, I - P) + ' ';
P := 0
end;
else
P := 0
end;
end;
if Length(sNew) > 0 then
begin
Delete(sNew, Length(sNew), 1);
AssignFile(F, 'c:\test.txt');
Rewrite(F);
Write(F, sNew);
CloseFile(F)
end
end.
Кому интересно - можете поискать отличие этого кода от кода [10]. Здесь, по сути дела, всего одно отличие. Но как много оно решает!
begin...end (2004-12-26 13:57:00) [3]> гость (26.12.04 12:25)
Кстати, Вы уже задавали этот вопрос, привожу текст той ветки:
гость (07.12.04 17:16)
Имеется строка вида 2*3+444*8+37*77+.......
вопрос.
Как найти в строке все * и числа стоящие перед * (2 444 37 и т.д.)записать в файл
1.txt через пробел.
--------------------------------------------------------------------------------
[1] Александр Иванов © (07.12.04 17:33)
Примерно так:
try
String:=TStringList.Create;
index:=pos('*', Str);
while index<>0 do
begin
if index<>byte(Str[0]) then
Str:=Copy(Str,index+1,byte(Str[0])-index);
else Str:='';
i:=index-1;
buffer:='';
Sub := Copy(Str,1,index-1);
while (i <> 0) or (not Sub[i] in ['0'..'9','.']) do
begin
buffer:=buffer+Sub[i];
dec(i);
end;
Strings.Add(buffer);
index:=pos('*', Str);
end;
Strings.SaveToFile(FileName);
finally
Strings.Free;
end;
--------------------------------------------------------------------------------
[2] begin...end © (07.12.04 19:31)
> гость (07.12.04 17:16)
uses StrUtils;
var
S: String;
I, J: Integer;
begin
S := '2*3+444*8+37*77+';
with TStringList.Create do
try
Delimiter := '*';
DelimitedText := S;
if Count > 0 then
Delete(Count - 1);
for I := 0 to Count - 1 do
for J := Length(Strings[I]) downto 1 do
if not (Strings[I][J] in ['0'..'9']) then
begin
Strings[I] := RightStr(Strings[I], Length(Strings[I]) - J);
Break
end;
SaveToFile('c:\1.txt')
finally
Free
end
end.
begin...end (2004-12-26 13:56:00) [4]> гость (26.12.04 12:25)
Например, так:
var
sOld, sNew: String;
I, P: Integer;
F: TextFile;
begin
sOld := '(5*sin(t)+7*sin(3t)+55*sin(7t)+';
P := 0;
for I := 1 to Length(sOld) do
case sOld[I] of
'0'..'9':
if P = 0 then P := I;
'*':
if P <> 0 then
begin
sNew := sNew + Copy(sOld, P, I - P) + ' ';
P := 0
end
else
P := 0
end;
if Length(sNew) > 0 then
begin
Delete(sNew, Length(sNew), 1);
AssignFile(F, 'c:\test.txt');
Rewrite(F);
Write(F, sNew);
CloseFile(F)
end
end.
aus (2004-12-26 13:04:00) [5]Подробнее:
отрывай файл перед началом цикла, в цикле пиши в него данные, по завершении цикла закрывай файл.
Rewrite(F1) создает новый файл, все что ты в него написал, естественно, пропадает.
гость (2004-12-26 12:57:00) [6]А поподробней
aus (2004-12-26 12:54:00) [7]Зачем каждый раз переоткрывать файл? Один раз открыл, записаол все, что нужно, и закрыл.
гость (2004-12-26 12:50:00) [8]
S:=Text;
a:=pos('*',s);
while a<>0 do
begin
b:=a-1;
w:='';
while ((s[b]>='0')and (s[b]<='9')) do
begin
w:=s[b]+w;
dec(b);
if b<0 then break;
c:=pos(')',s);
s:=copy(s,c+1,length(s)-c);
a:=pos('*',s);
assignfile(F1,'C:\programming.txt');
{$I+}
ReWrite(F1);
{$I-}
Writeln(F1,w);
CloseFile(F1);
end;
end;
Gero (2004-12-26 12:42:00) [9]
> гость (26.12.04 12:41)
Показывай, что не работает.
гость (2004-12-26 12:41:00) [10]Да пробовал но не работает.
Gero (2004-12-26 12:36:00) [11]Ну раз понятно, почему бы не написать самому?
гость (2004-12-26 12:35:00) [12]Это понятно а пример 100% работающий можно.
Gero (2004-12-26 12:32:00) [13]Pos, Delete
AssignFile, Reset, Write, CloseFile