Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem delphi memory/string stream

dobry den,
mam mensi problem s tymto kodom:

    ...
    zdrojak:TStringStream;
    zdrojak1:TMemoryStream;                     
begin
    zdrojak1:=TMemoryStream.Create();       
    zdrojak1.LoadFromFile(SuborStiahnuteData);   
    zdrojak:=TStringStream.Create(''); 
    zdrojak.CopyFrom(zdrojak1,zdrojak1.Size);
    zaciatokRiadok:=pos('td id=',zdrojak.DataString);
    zaciatokUdaj:=PosEx('>',zdrojak.DataString,zaciatokRiadok);

do zdrojak1 sa mi asi spravne nacita subor(stiahnuta webstranka). ked som to po nacitani zo suboru hned ulozil do dalsieho suboru, tak to bolo rovnake ALE zdrojak1.size mi ukazuje mensiu hodnotu! resp. rovnaku hodnotu ako zdrojak.size....ked sa pouzije ta hodnota, tak obsahuje iba stvrtinu udajov zo stranky. jej velkost je okolo 125 000.

problem je, ze ked pouzijem zdrojak.CopyFrom, tak sa mi tam nenakopiruju vsetky data. robim to preto takto, aby som v tom stringstream mohol vyhladavat pomocou pos a posex funkcii.

odkopiroval som to z programu co som robil kedysi a vtedy mi to fungovalo. nevie mi niekto poradit preco mi to nejde, alebo ako to spravit tak, aby mi to islo?

dakujem.

loading...
Předmět Autor Datum
skusil som to est etakto obklukou: AssignFile(suborDochadzka,SuborStiahnutaDochadzka); Reset(subor…
Pavol 23.12.2010 09:37
Pavol
Nepochopil jsem, co tim kodem chces dosahnout. Stringy obecne skonci znakem #0, takze pokud tento zn…
Jan Fiala 23.12.2010 10:17
Jan Fiala
chcem dosiahnut to, ze zdrojovy kod stranky nacitam zo suboru do stringstreamu aby som s nim mohol p…
Pavol 23.12.2010 11:47
Pavol
Nepotrebujes StringStream, zkus mito toho pouzit TStringList - je to kolekce retezcu. var sl: TStri…
Jan Fiala 23.12.2010 13:03
Jan Fiala
Potrebuješ zistiť výskyt nejakého reťazca v súbore? Aspoň tak som to pochopil.... Ja by som to rieš… poslední
pme 23.12.2010 13:07
pme

skusil som to est etakto obklukou:

 AssignFile(suborDochadzka,SuborStiahnutaDochadzka);
    Reset(suborData);
    while not eof(suborData) do
    begin
       readln(suborData,riadok);
       zdrojak.WriteString(riadok);
    end;
    Close(suborData);

a ani takto to nejde-nenacita to cely subor-subor je pritom spravny.

chcem dosiahnut to, ze zdrojovy kod stranky nacitam zo suboru do stringstreamu aby som s nim mohol pracovat(pomocou funkcii pos a posex hladat udaje ktore potrebujem na dalsiu pracu.)

edit: pises, ze nemam pouzivat stringstream-ako inac sa to da spravit?
a nie som si isty s tym #0, lebo ono to skonci v strede slova.

pouzil by som c#, ktory taktiez zvladam, ale nie som si isty, ci budem moct nainstalovat netframework na stroji na ktorom to chcem spustit.

Nepotrebujes StringStream, zkus mito toho pouzit TStringList - je to kolekce retezcu.

var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile(jmeno_souboru);
  sl.Add('Pridam retezec');
  sl.Strings[1] := Copy(sl.Strings[1], 1, 10);  // upravim radek
  sl.Delete(2);  // smazu retezec s indexem 3
  sl.SaveToFile(jmeno_souboru);
end;

TStringStream je takovy divny hybrid.
Kdyz pracujes se streamem, musis si hlidat velikost apod.

Zkus sem dat priklad souboru, ktery zpracovavas.
Neni problem zdrojovy kod webove stranky stahnout primo do TStringList a pak prochazet bez nutnosti jakychkoliv mezisouboru.

Potrebuješ zistiť výskyt nejakého reťazca v súbore? Aspoň tak som to pochopil....

Ja by som to riešil asi takto:

function PosInFile(Str,FileName:string):integer;
 var
   Buffer:array[0..1023]of char;
   BufPtr,BufEnd:integer;
   F:File;
   Index:integer;
   Increment:integer;
   c:char;

 function NextChar:char;
 begin
   if BufPtr>=BufEnd then
   begin
     BlockRead(F,Buffer,1024,BufEnd);
     BufPtr := 0;
     Form1.ProgressBar1.Position := FilePos(F);
     Application.ProcessMessages;
   end;
   Result := Buffer[BufPtr];
   Inc(BufPtr);
 end;

 begin
   Result := -1;
   AssignFile(F,FileName);
   Reset(F,1);
   Form1.ProgressBar1.Max := FileSize(F);
   BufPtr:=0;
   BufEnd:=0;
   Index := 0;
   Increment := 1;
   repeat
     c:=NextChar;
     if c=Str[Increment] then
       Inc(Increment)
     else
     begin
       Inc(Index,Increment);
       Increment := 1;
     end;
     if Increment=(Length(Str)+1) then
     begin
       Result := Index;
       Break;
     end;
   until BufEnd = 0;
   CloseFile(F);
   Form1.ProgressBar1.Position := 0;
 end;

Zpět do poradny Odpovědět na původní otázku Nahoru

loading...