znikające spacje w łańcuchu

0

Witam!
Programuje program do szyfrowania/deszyfrowania danych i natrafiłem na dziwny problem.

W długim łańcuchu str występuje wiele spacji, ucinam kawałek łańcucha (Delate) po czym używam funkcji Pos, która o dziwo nie znajduje żadnej ww. spacji (wiem że na pewno są -> notatnik). Podglądam łańcuch, po operacji usuwania jego fragmentu, i widzę, że kończy się na pierwszej napotkanej, spacjii! np. było ?aaaabbbb cccc?, ucinam ?aaaa?, a zostaje tylko ?bbbb?! Co ciekawsze, jak dodam do mojego skróconego łańcucha + ' ', okazuje się, że wraca on do przewidywanej przeze mnie formy ?bbbb cccc?!? Nie wiem co myśleć i czy to przypadek. Jak zniwelować efekt samo ucinających się łańcuchów?? Program bawiący się z kodami wymaga dokładności, dziękuj.
P.S. Użyłem książek i szukaj, lecz magicznych spacji nie znalazłem.

var
 F : textfile;
 str : string;
 p,k : integer;                      //pozycja w texcie
begin
 AssignFile(F,'C:\proba.dat'); //tu jest zaszyfrawany plik
 Reset(F);
 Read(F,str);
 p := Pos('proba234567',str); //początek ineresującego mnie fragmentu jest za tym kluczem
 Delete(str,1,p+10);              //10=-1+11
 str:=str+' ';                         //dziwna funkcja "uzdrawiająca"
 k := Pos(' ',str);                   //koniec interesujacego mnie fragmentu jest przed pierwszą spacją
 Edit1.Text:=Copy(str,1,k-1); //napisz interesujący mnie fragment
 If p=10 then Edit1.Text:='<brak danych>'; //jeśli mnie ma klucza - brak danych
 Caption:=IntToStr(p) + '~~'  + IntToStr(k) + '~~'+ str[p] + '~~'+ str + '~~';  //dzięki temu sprawdzam "co mn myśli"
end;

Urzywam D7 z gazetki ;D

0

oczywiście bez pogrubiono-podkreślonej jedynki, przepraszam...

var
F : textfile;
str : string;
p,k : integer; //pozycja w texcie
begin
AssignFile(F,'C:\proba.dat'); //tu jest zaszyfrawany plik
Reset(F);
Read(F,str);
p := Pos('proba234567',str); //początek ineresującego mnie fragmentu jest za tym kluczem
Delete(str,1,p+10); //10=-1+11
str:=str+' '; //dziwna funkcja "uzdrawiająca"
k := Pos(' ',str); //koniec interesujacego mnie fragmentu jest przed pierwszą spacją
Edit1.Text:=Copy(str,1,k-1); //napisz interesujący mnie fragment
If p=10 then Edit1.Text:='<brak danych="danych">'; //jeśli mnie ma klucza - brak danych
Caption:=IntToStr(p) + '' + IntToStr(k) + ''+ str[p] + ''+ str + ''; //dzięki temu sprawdzam "co mn myśli"
end;

0

BTW: linię wczytuje się ReadLn a nie Read

var
  F, G : textfile;
  str : string;
  p,k : integer;                      
begin
  AssignFile(F, 'C:\proba.dat'); 
  AssignFile(G, 'C:\test.txt'); 
  Reset(F);
  ReWrite(G);
  while not EoF(F) do
  begin
    ReadLn(F, str);
    WriteLn(G, 'Odczyt: ', str);
    p := Pos('proba234567', str); 
    WriteLn(G, 'p: ', p);
    k := Pos(' ', str);                   
    WriteLn(G, 'k: ', k);
    str := Copy(str, p, k - p - 1);
    WriteLn(G, 'Str(p, k): ', str);
  end;
  Close(F);
  Close(G);
end;

w pliku proba.dat zostaw ze 3 linijki, uruchom ten kod i podaj na forum zawartośc zarówno pliku proba.dat jak i test.txt

0

proba.dat:

ddfvxdfbsthtbh proba234567jnjknjn kjkjdfoij ijfdiojvio jg ioj jig fijo 
sefjsl fvnsjkef nvjkner fjkv ndjk frndj kfnvjkv nrgnvjkngj  drnsvjnd jvg ndrjkgvn
vfgdxgdl;,ujns m jvorg jporigjvmoisj oirjvproba234567fv aopi jpotigj opivthopbog

test.text:

Odczyt: ddfvxdfbsthtbh proba234567jnjknjn kjkjdfoij ijfdiojvio jg ioj jig fijo 
p: 20
k: 19
Str(p, k): 
Odczyt: sefjsl fvnsjkef nvjkner fjkv ndjk frndj kfnvjkv nrgnvjkngj  drnsvjnd jvg ndrjkgvn
p: 0
k: 7
Str(p, k): sefjsl
Odc

Lecz nie w ort!, w oryginale całość zapisana jest jako jedna wielka linia (dlatego <ort>pominołem </ort>EoF ReadLn itd...) Ucieło 3cią linijkę... dziwne, ale coś mu nie pasuje z Close(F).

0
var
  F, G : textfile;
  str : string;
  p,k : integer;                      
begin
  AssignFile(F, 'C:\proba.dat'); 
  AssignFile(G, 'C:\test.txt'); 
  Reset(F);
  ReWrite(G);
  while not EoF(F) do
  begin
    ReadLn(F, str);
    WriteLn(G, 'Odczyt: ', str);
    p := Pos('proba234567', str); 
    WriteLn(G, 'p: ', p);
    Delete(str, 1, p + 11);
    WriteLn(G, 'Delete: ', str);
    k := Pos(' ', str);                   
    WriteLn(G, 'k: ', k);
    str := Copy(str, 1, k - 1);
    WriteLn(G, 'Str(p, k): ', str);
  end;
  Close(F);
  Close(G);
end;

a tak?

0

dat ten sam
a txt:

Odczyt: ddfvxdfbsthtbh proba234567jnjknjn kjkjdfoij ijfdiojvio jg ioj jig fijo 
p: 20
Delete: njknjn kjkjdfoij ijfdiojvio jg ioj jig fijo 
k: 7
Str(p, k): njknjn
Odczyt: sefjsl fvnsjkef nvjkner fjkv ndjk frndj kfnvjkv nrgnvjkngj  drnsvjnd jvg ndrjkgvn
p: 0
Delete: sjkef nvjkner fjkv ndjk frndj kfnvjkv nrgnvjkngj  drnsvjnd jvg ndrjkgvn
k: 6
Str(p, k): sjkef
Odczyt: vfgdxgdl;,ujns m jvorg jporigjvmoisj oirjvproba234567fv aopi jpotigj opivthopbog
p
0

Na moje oko wsio jest dobrze

var
  F: textfile;
  str : string;
  p,k : integer;                      
begin
  AssignFile(F, 'C:\proba.dat'); 
  Reset(F);
  while not EoF(F) do
  begin
    ReadLn(F, str);
    p := Pos('proba234567', str); 
    Delete(str, 1, p + 10);
    k := Pos(' ', str);                   
    str := Copy(str, 1, k - 1);
  end;
  Close(F);
end;

a problem był pewnie w tym, że miałeś Read zamiast ReadLn

0
Misiekd napisał(a)

BTW: linię wczytuje się ReadLn a nie Read

To nie jest BTW, to jest właśnie sedno sprawy. Read wczytuje do znaku spacji, znaku eof albo do nowej linii, readln wczytuje do eof albo do nowej linii.
Poza tym jeśli w tym pliku siedzą jakieś śmieci (konkretnie to, co się kryje za tymi kwadracikami), to plik powinien być czytany binarnie, a nie tekstowo. Powinien nie oznacza że musi, ale oznacza też, że możesz natrafić na kilka dziwnych problemów, np. znak eof w środku pliku.

0
ŁF napisał(a)

... np. znak eof w środku pliku.

chyba żartujesz :d

// nie, nie żartuję; spróbuj na przykład wczytać dowolny plik exe jako plik tekstowy - wczyta się tylko nagłówek ('MZ' + JMP + 'This program cannot blabla') - Ł

0

Dlaczego niby? W pliku binarnym jak najbardziej może być taki znak :|

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