Fehler bei Lesen eienr Zeile einer Datei

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Fehler bei Lesen eienr Zeile einer Datei

Beitrag von pascalts »

Hallöchen! Bei folgendem Teil meines Programms (liest einen teil einer Datei ('Text') aus) bekomme ich immer einen Fehler:

Code: Alles auswählen

//Applikaion
        begin
         SLOapp:=TStringList.Create;
         SLOapp.LoadFromFile(SelectDirectoryDialogAusgabe.FileName + '\Temp\' + lbROBOTERLISTE.Items[i] + '\KRC\R1\System\$config.dat' );     //2do!!!
         SLRapp:=TStringList.Create;
         l:=0;
         For l:=0 to SLOapp.Count-1 do
          begin
           if (SLOapp[l][1]='
T') and (SLOapp[l][6]='N') and (SLOapp[l][16]<>'T') and (SLOapp[l][17]<>'T') then
            begin
              SLRapp.Add(SLOapp[l]);  //FEHLER TRITT BEI EINIGEN DOKUMENTEN HIER AUF
             end;
          end;
         SLRapp.Text:=StringReplace(SLRapp.Text, '
TOOL_NAME[' , '' , [rfReplaceAll, rfIgnoreCase]);
         SLRapp.Text:=StringReplace(SLRapp.Text, '
T' , '' , [rfReplaceAll, rfIgnoreCase]);
         SLRapp.Text:=StringReplace(SLRapp.Text, '
,]="', '' , [rfReplaceAll, rfIgnoreCase]);
         l:=9;
         while l>=0 do
          begin
          SLRapp.Text:=StringReplace(SLRapp.Text, inttostr(l) , '' , [rfReplaceAll, rfIgnoreCase]);
          l:=l-1;
          end;
         SLRapp.Text:= StringReplace(SLRapp.Text, '"
', '', [rfReplaceAll, rfIgnoreCase]);
         //ShowMessage(SLRapp.Text[1]);
         //ShowMessage(wstr);
         wstr:=SLRapp.Text;
         varBookmark := varDokument.Bookmarks.Item('
Applikationen');
         varBookmark.Range.Text := wstr;
 
        end;                                 


Fehler:

Code: Alles auswählen

Projekt pROBOTERDOKUTOOL hat Exception-Klasse >>External: SIGSEGV<< ausgelöst. In Datei 'uroboterdokutool.pas' in Zeile 534:  if (SLOapp[l][1]='T') and (SLOapp[l][6]='N') and (SLOapp[l][16]<>'T') and (SLOapp[l][17]<>'T') then
- wohlgemerkt beim dritten Durchlauf.

Ich habe das Gefühlt, das die Schleife weiter läuft, obwohl die Bedingungen nicht mehr erfüllt sind.

Eine Datei bei der es funktioniert: http://pastebin.com/Xqh3aGwh (Zeile 150 in etwa)
Eine Datei bei der ein Fehler kommt: http://pastebin.com/jEaBpZ50 (150)

Kann mir das jemand erklären? Mich irritiert das es bei beinahe Identischen Dateien mal geht, mal nicht...

Vielleicht noch wichtig: Die ersten 2 Durchläufe klappen einwandfrei (druch schowmessage angezeigt), doch dann gibt es den Fehler...

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler bei Lesen eienr Zeile einer Datei

Beitrag von wp_xyz »

Was bei Zeile 150 ist, weiß ich nicht. Aber auf jeden Fall emthält die "schlechte" Datei Leerzeilen, daher wird schon der Zugriff auf das 1. Zeichen schief gehen.

Und wenn wir schon dabei sind: du greifst ist der fraglichen Code-Zeile auch noch auf andere String-Positionen zu, das letzte ist das 17.Zeichen zu. Daher musst du auf eine Mindest-Stringlänge >= 17 prüfen. So wie ich beim Überfliegen gesehen habe, enthält die Datei nur normale ASCII Zeichen, so dass die normalen Ansi-Funktionen ok sind, ansonsten müsstest du die UTF8-Funktionen verwenden:

Code: Alles auswählen

 
l := 0;
for l := 0 to SLOapp.Count-1 do
begin
  if Length(SLOapp[l]) < 17 then
    continue;
  if (SLOapp[l][1]='T') and ....
 

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Fehler bei Lesen eienr Zeile einer Datei

Beitrag von baumina »

Es ist gefährlich auf eine feste Stelle innerhalb eines Strings zuzugreifen ohne zuvor zu prüfen, ob der String überhaupt so lange ist.

Code: Alles auswählen

if (SLOapp[l][1]='T') and (SLOapp[l][6]='N') and (SLOapp[l][16]<>'T') and (SLOapp[l][17]<>'T') then


Was ist denn wenn der String nur 10 lang ist, du aber die Stelle 16 überprüfen willst ... genau, das führt dazu, dass du irgendwo im Speicher irgendwas findet und dann knallts.
.

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Fehler bei Lesen eienr Zeile einer Datei

Beitrag von pascalts »

wp_xyz hat geschrieben:Was bei Zeile 150 ist, weiß ich nicht. Aber auf jeden Fall emthält die "schlechte" Datei Leerzeilen, daher wird schon der Zugriff auf das 1. Zeichen schief gehen.

Und wenn wir schon dabei sind: du greifst ist der fraglichen Code-Zeile auch noch auf andere String-Positionen zu, das letzte ist das 17.Zeichen zu. Daher musst du auf eine Mindest-Stringlänge >= 17 prüfen. So wie ich beim Überfliegen gesehen habe, enthält die Datei nur normale ASCII Zeichen, so dass die normalen Ansi-Funktionen ok sind, ansonsten müsstest du die UTF8-Funktionen verwenden:

Code: Alles auswählen

 
l := 0;
for l := 0 to SLOapp.Count-1 do
begin
  if Length(SLOapp[l]) < 17 then
    continue;
  if (SLOapp[l][1]='T') and ....
 


mit zeile 150 meinte ich zeile 150 der gepasteden datei (was die auszulesende datei ist :-) ) ich seh mal was ich mit der länge machen kann...

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Fehler bei Lesen eienr Zeile einer Datei

Beitrag von pascalts »

ja, so sieht das schon besser aus. Danke!

Antworten