Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

запись в файл [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо