[Delphi] usuwanie nadmiarowych spacji z pliku

0

Chcę usunąć z pliku .txt spacje położone obok siebie. Napisałam następujący kod:

Reset(plik);
Read(plik,znak1);
calyplik:=znak1;

while not Eof(plik) do
  begin
  Read(plik,znak2);
  if (znak1=#32) and (znak2=#32) then znak2:=#0; //32 w ASCII to spacja, a 0 to null
  calyplik:=calyplik+znak2;
  if znak2=#0 then znak2:=#32;
  znak1:=znak2;
  end;
Memo1.Text:=calyplik;

znak1, znak2 to zmienne typu char
calyplik to zmienna typu string

I wygląda to tak, że w Memo pojawia się tylko pierwszy ciąg znaków oraz pojedyncza spacja i na tym koniec. Dlaczego nie widać kolejnych 'wyrazów'?

0
gumka napisał(a)

I wygląda to tak, że w Memo pojawia się tylko pierwszy ciąg znaków oraz pojedyncza spacja i na tym koniec. Dlaczego nie widać kolejnych 'wyrazów'?

poniewaz string to ciag znakow zakonczony znakiem #0.
dlatego jesli gdziekolwiek w stringu wstawisz znak #0 to delphi pomysli ze to koniec stringa.
najprosciej problem rozwiazac tak:

Memo1.Lines.LoadfromFile('plik.txt');
Memo1.Text:=StringReplace(memo1.text, '  ', ' ', [rfReplaceAll]); //pisane z glowy wiec cos moze byc nie tak :P

tylko nie wiem jak sie zachowa dla dlugich plikow.
mozesz tez dac petle i zmieniac kazda linijke w memo.

0

Gumka, możesz zrobić po swojemu, ale trzeba trochę zmodyfikować (skrócić) kod

...
while not Eof(plik) do begin
  Read(plik, znak2);
  if not ((znak1 = #32) and (znak2 = #32)) then calyplik:= calyplik + znak2;
  znak1:= znak2;
end;
...
0

poniewaz string to ciag znakow zakonczony znakiem #0.
dlatego jesli gdziekolwiek w stringu wstawisz znak #0 to delphi pomysli ze to koniec stringa.

W Delphi nie jest z tym tak dokładnie jak w C: ponieważ string

 posiada zarówno informację o długości, jak i #0 tuż za końcem (czyli w miejscu <code noframe>s[length(s)+1]

, niektóre funkcje biblioteczne operujące na stringach staną na pierwszym znaku #0, a inne będą jechały do końca stringa określonego przez jego długość.
W rezultacie znak #0 w delphiowym stringu powoduje zachowanie nieokreślone: nie wolno zakładać że #0 w środku stringa go w tym miejscu przerwie, albo że nie przerwie.

0

Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1