Wielokrotny odczyt pliku UTF8 daje różne wyniki na pierwszym znaku,czyli cuda przy czytaniu pliku

0

Wczytuję do ListView zawartość pliku .csv Plik UTF8 jest prosty w budowie, jednak pierwsza linijka zawiera 3 dodatkowe znaki o kodach: #239 #187 #191
Nic się w tym pliku nie zmienia, ale gdy wciskam klawisz wczytywania, tylko co piąty raz odczytany kod znaku ma tą samą wartość:

procedure TForm5.btWczytajUliceClick(Sender: TObject);
const
  nKolumnaMax: integer=3;  //poprawić aWektor przy zmianie
var
  TFwejscie: TextFile;
  sPlikWej: string;

  sBuf, sRoboczy: string;
  ListItem: TListItem;
  nCounter: integer;
  aWektor: array[0..3] of string;       //nKolumnaMax
  nZnak, jj,ii, nPoz: integer;
  lPierwsza: boolean;
  sKomenda: string;

begin
  if lvListaMiast.ItemIndex=-1 then
  begin
    MessageBox(0,'Wybierz miasto','Brak wyboru',MB_OK+MB_ICONWARNING);
    EXIT;
  end;

  lPierwsza:=true;

  sPlikWej:='ULICE'+lvListaMiast.Selected.Caption+'.csv';
  parametry.miasto_czytane:=lvListaMiast.Selected.SubItems[0];  //id_miasta do klasy
  if not FileExists(sPlikWej) then
  begin
    MessageBox(0,pchar('Brak pliku: '+sPlikWej),'BŁĄD!!',MB_OK+MB_ICONWARNING);
    EXIT;
  end;

  AssignFile(TFwejscie,sPlikWej);
  ProgressBar1.Max:=1000;
  nCounter:=0;

  try
    Reset(TFwejscie);
    lvUlice.Clear;
    while not eof(TFwejscie) do
    begin
      Readln(TFwejscie,sBuf);
      ProgressBar1.Position:=nCounter;
      inc(nCounter);

      //rozbiór na kawałki po tabulatorze
      sRoboczy:=UTF8ToString(sBuf);
      nZnak:=ord(LeftStr(sBuf,1));               <-----------------  tu czytam pierwszy znak

if lPierwsza then
begin
  Memo1.Lines.Add(IntToStr(nZnak));
  lPierwsza:=false;
end;


      if nZnak=12198892 then           //w pierwszej linijce dodatkowe śmieci, wartość dziwna, ale odczytana z debugera
        sRoboczy:=RightStr(sRoboczy,Length(sRoboczy)-1);


      for ii := 0 to nKolumnaMax do
      begin
        nPoz:=pos(';',sRoboczy);//gdzie jest tabulator
        if ii=nKolumnaMax then
          nPoz:=100;  //ostatnia nie jest zamknięta tabulatorem
        aWektor[ii]:=leftStr(sRoboczy,nPoz-1);
        sRoboczy:=Copy(sRoboczy,nPoz+1,length(sRoboczy));//kopiuje resztę na prawo po tabulatorze
      end;


      ListItem:=lvUlice.Items.Add;
      ListItem.Caption:=IntToStr(nCounter); //0
//      for ii := 0 to nKolumnaMax do
//gubimy kolumne z ul.
      ListItem.SubItems.Add(aWektor[0]);  //0   teryt
      //ul. gubi
      ListItem.SubItems.Add(aWektor[2]);  //1 ulica1
      ListItem.SubItems.Add('');  //2 puste na numery

      ListItem.SubItems.Add('');  //3 puste na obwód
      ListItem.SubItems.Add('');  //4 puste na ilość trafień

      if aWektor[3]<>'NULL' then
        ListItem.SubItems.Add(aWektor[3])
      else
        ListItem.SubItems.Add('');  //5 ulica2


    end;
  finally
    CloseFile(TFwejscie);
  end;

 

Kolejne uruchamianie odczytu pliku, dla pierwszej linijki daje takie wyniki (kod pierwszego znaku):
Memo1
12198844
12198916
12198868
12198892
12198964
12198844 <----powtarza cykl
12198916
12198868

Początek zawartości pliku:
00090;ul.;Abrahama;Antoniego
00097;ul.;Achillesa;NULL
00134;ul.;Afrodyty;NULL

Oczywiście mogę inaczej obejść ten problem:
nZnak:=ord(sBuf[1])

ale ciekawi mnie, jakim cudem w tej konstrukcji, ten sam plik zwraca różne wyniki?

0

Jaka wersja Delphi? To bardzo ważne.

nZnak:=ord(LeftStr(sBuf,1));
nZnak := ord(sBuf[1]);
if nZnak=12198892 then 

WTF?

0

Delphi 2009, a nZnak=12198892 to wartość odczytana z debugera

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