Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textzeile in Txt auslesen (https://www.delphipraxis.net/25697-textzeile-txt-auslesen.html)

Alexander Roth 10. Jul 2004 17:48


Textzeile in Txt auslesen
 
Wie lese ich in einer Txt Datei eine ganz bestimmte Zeile aus, zB. Zeile 576 :?:

Nikolas 10. Jul 2004 17:50

Re: Textzeile in Txt auslesen
 
Du machst 576 mal ein readln. Dann hast du die Zeile. Andere Möglichkeit wär seek, aber ich bin nicht sicher ob das auch bei .txt geht.

Aenogym 10. Jul 2004 17:54

Re: Textzeile in Txt auslesen
 
ganz einfach so:

Delphi-Quellcode:
var sl: TStringList;
    zeile: string;
begin
  sl := TStringList.Create;
  sl.loadfromfile('diedatei.txt');
  zeile := sl[576];
  sl.free;
end;
dann hast du zeile 576 in der variable "zeile" ;)

Aenogym

Alexander Roth 10. Jul 2004 17:56

Re: Textzeile in Txt auslesen
 
In einer Schleife, ist das nicht ein bisschen umständlich?

Alexander Roth 10. Jul 2004 17:59

Re: Textzeile in Txt auslesen
 
Die obere Antwort bezieht sich auf das vorherige. Mein Browser hat es nicht so schnell aktualiesiert.

Gute Idee.

Danke.

Nikolas 10. Jul 2004 18:01

Re: Textzeile in Txt auslesen
 
Is schon recht umständlich. Die Methode von Aenogym ist da viel besser.

Tipp: Du kannst deinen Beitrag auch editieren und musst nicht immer einen neuen Beitrag schreiben.

Alexander Roth 16. Jul 2004 05:28

Re: Textzeile in Txt auslesen
 
Also, bei mir compiliert er zwar fehlerfrei, aber beim Auwsführen bringt er einen Fehler.
Ich habe mal alles unwichtige aus meiner Procedure gestrichen und es hier dargestellt.
Erkennt vielleicht jemand was daran falsch ist???
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var    sl: TStringList;
       f:textfile;

begin

assignfile(f, 'E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt');
rewrite(f);
write(f, '2');

    while j < aerg do
      begin
        sl.loadfromfile('E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt');
        primzahl:=strtoint64(sl[j]);
        sl.free;
      end;
closefile(f);
end;
:?:

alcaeus 16. Jul 2004 05:53

Re: Textzeile in Txt auslesen
 
Ich hab hier im Moment kein Delphi, und weiß eben nicht ob LoadFromFile mit einer geöffneten Datei zurechtkommt. Muss die Datei denn unbedingt in der ganzen Prozedur geöffnet sein?

Greetz
alcaeus

Alexander Roth 16. Jul 2004 06:05

Re: Textzeile in Txt auslesen
 
Ja gut, ich habs jetzt umgestellt, klappt aber trotzdem noch nicht. Der Computer hat nun einen seiner anderen Fehler ausgespuckt beim ausführen.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var   sl: TStringList;
    f:textfile;

begin

assignfile(f, 'E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt');
rewrite(f);
write(f, '2');
closefile(f);
sl := TStringList.Create;

    while j < aerg do
      begin
        sl.loadfromfile('E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt');
        primzahl:=strtoint64(sl[j]);
        sl.free;
      end;
end;

Duffy 16. Jul 2004 06:27

Re: Textzeile in Txt auslesen
 
Hallo Alexander Roth,
habe mal deinen Code kommentiert. Ich denke Du siehst selber was falsch ist. Ferner würde die Stringliste auch mit einem Fehler versagen. Du wirbelst da mit j und aerg rum, aber was ist wenn deine Liste nur einen String enthält und deine Variablenwerte oberhalb von 0 liegen?

Zitat:

Zitat von Alexander Roth
Ja gut, ich habs jetzt umgestellt, klappt aber trotzdem noch nicht. Der Computer hat nun einen seiner anderen Fehler ausgespuckt beim ausführen.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var   sl: TStringList;
    f:textfile;

begin

assignfile(f, 'E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt'); <= OK Darei zuweisen
rewrite(f); <= und eine leere aufmachen
write(f, '2'); <= eine Zahl als Text hinein
closefile(f); <= und die Datei wieder schließen
sl := TStringList.Create; <= Stringliste erzeugen

    while j < aerg do
      begin
        sl.loadfromfile('E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt'); <= Datei laden
        reset(f); <= Datei zurücksetzen. IST ABER NICHT MEHR OFFEN -- FEHLER WEIL OBEN SCHON GESCHLOSSEN
        primzahl:=strtoint64(sl[j]); <= mach irgendwas ...
        closefile(f); <= ist zwar schon zu ... macht nichts ... die Runtime bringt einen Fehler
        sl.free; <= Sringliste freigeben
      end;
end;

bye
Claus

Alexander Roth 16. Jul 2004 06:43

Re: Textzeile in Txt auslesen
 
Ja, könnte sein dass mit den Variablenwerten mein Fehler liegt. Ich probier mal weiter.
Was macht reset? Ich hab gelesen es würde eine Datei öffnen.
Frage: Was öffnet denn eine Datei damit man im Quellcode reinschreiben kann???

GuenterS 16. Jul 2004 07:31

Re: Textzeile in Txt auslesen
 
Zitat:

Zitat von Alexander Roth
Ja gut, ich habs jetzt umgestellt, klappt aber trotzdem noch nicht. Der Computer hat nun einen seiner anderen Fehler ausgespuckt beim ausführen.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var   sl: TStringList;
    f:textfile;

begin

assignfile(f, 'E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt');
rewrite(f);
write(f, '2');
closefile(f);
sl := TStringList.Create;

    while j < aerg do
      begin
        sl.loadfromfile('E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt');
        primzahl:=strtoint64(sl[j]);
        sl.free;
      end;
end;

Das kann ja auch gar nicht funktionieren! Du gibst innerhalb der Schleife die StringListe wieder frei.
auch würde es reichen wenn du die Datei nur einmal ladest und nicht in jedem Durchgang.

Würde es so vorschlagen


Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
const
  CFileName = 'E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt';
var
  sl: TStringList;
  f:textfile;
  j,aerg: integer;
begin
  j:=0;
  assignfile(f, CFileName);
  rewrite(f);
  write(f, '2');
  closefile(f);
  sl := TStringList.Create;
  try
    sl.loadfromfile(CFileName);  
    while ((j < aerg) and (j < sl.count)) do
    begin
      primzahl:=strtoint64(sl[j]);
      j := <...>
    end;
  finally
    sl.free;
  end;
end;
Irgendwas mußt Du mit diesem j schon noch machen, sonst hast Du eine Endlosschleife

Rackergen2 16. Jul 2004 11:54

Re: Textzeile in Txt auslesen
 
nebenbei hast du da eine nette Endlosschleife, da du werder j noch aerg veränderst... ich nehme an, du willst j jedesmal um eins erhöhen? das geht am Besten mit inc(j) oder du machst eine for-Schleife...

GuenterS 16. Jul 2004 15:15

Re: Textzeile in Txt auslesen
 
Zitat:

Zitat von Rackergen2
nebenbei hast du da eine nette Endlosschleife, da du werder j noch aerg veränderst... ich nehme an, du willst j jedesmal um eins erhöhen? das geht am Besten mit inc(j) oder du machst eine for-Schleife...


Das habe ich vorher eh auch schon dazugeschrieben und durch das j:= <...> angedeutet. Ein weiteres Problem besteht sicher durch die fehlende Initialisierung von aerg...

Alexander Roth 19. Jul 2004 13:54

Re: Textzeile in Txt auslesen
 
Das ist alles nicht das Problem. Das habe ich alles im hier aufgefürten Code weggelassen,(hab ich geschrieben) da es die übersichtlichkeit erhöht. Wenn es euch interessiert: Ich habe auch noch eine Schleife über diese gestülpt, in der allerdings nichts relevantes passiert. Es ist weder eine nicht deklarierte Variable (was der Compiler zweifelslos gemeldet hätte), noch ist es eine Endlosschleife oder ähnliches.

GuenterS 19. Jul 2004 13:59

Re: Textzeile in Txt auslesen
 
Naja vermutlich ist es genau diese Schleife...

Luckie 19. Jul 2004 14:36

Re: Textzeile in Txt auslesen
 
Obwohl dein Code schon korrigiert wurde:
Zitat:

Zitat von Alexander Roth
Der Computer hat nun einen seiner anderen Fehler ausgespuckt beim ausführen.

Gibt es einen Grund, warum du uns die genaue Fehlermeldung verschiegen hast?

GuenterS 19. Jul 2004 15:32

Re: Textzeile in Txt auslesen
 
Ich wäre überhaupt dafür mal die ganze Methode zu sehen und nicht nur die angeblich relevanten Teile. Wenns wirklich lang ist vielleicht als Anhang. Wird sonst ja doch nur ein Raten im Nebel. Man weiß ja auch nicht wo diese Schleife die über dem gesamten Code sein soll angeordnet ist...

Alexander Roth 20. Jul 2004 08:00

Re: Textzeile in Txt auslesen
 
Der code:
Code:
procedure TForm1.Button3Click(Sender: TObject);
const
  Pfad = 'E:\Delphi\Mathematik\Aufgelistete Primzahlen.txt';
var i,j,k : int64;
    primzahl:int64;
    sl: TStringList;
    f:textfile;
begin
assignfile(f,Pfad);
rewrite(f);
write(f, '2');
closefile(f);
zeit := time;
sl := TStringList.Create;
memo1.Clear;
abbruch := false;
aerg := 1;
j:=0;
nochr :=false;
if strtoint64(edit7.Text)<2 then exit else i:=3;
while i<strtoint64(edit7.Text)do
begin
  try
    while (j < aerg)and(j< sl.count) do
      begin
        sl.loadfromfile(pfad);
        primzahl:=strtoint64(sl[j]);
        if i mod primzahl > 0 then nochr:= true//primzahl noch ja
        else //keine Primzahl
            begin
              nochr:= false;
              j:= aerg;
            end;
        inc(j);
      end;
  finally
    sl.free;
  end;
//für das array und fürs weiterkommen und für die txt
    if (nochr=true)then
      begin
        inc(aerg);
        reset(f);
        writeln(i);
        closefile(f);
      end;
    statusbar1.Panels[4].Text:= 'Benötigte Zeit: ' + timetostr(time-zeit);
//    statusbar1.Panels[3].Text:= 'Dargest. Ergebnisse: '+inttostr(aserg);
    statusbar1.Panels[2].Text:= 'Ergebnisse: '+inttostr(aerg);
    statusbar1.Panels[1].Text:= 'Zahl: ' +inttostr(i);
    statusbar1.Panels[5].Text:= Format('%f', [aerg/i*100])+'% Erg.';
    application.ProcessMessages;
    if abbruch = true then
      begin
        statusbar1.Panels[5].Text:= Format('%f', [aerg/i*100])+'% Erg.';
        j:=aerg+1;
        i:=strtoint64(edit7.Text)+1;
      end;
  i:=i+2;
  j := 0;
end;
end;
Erklärungen: edit7 ist der Enwert
manche Variablen habe ich nicht als lokale Variable sondern als übergeordnete.


Zitat:

Gibt es einen Grund, warum du uns die genaue Fehlermeldung verschiegen hast?
Der Fehler wechselt machmal, wenn ich was verändere.
Zur Zeit gibt er diesen reizenden Fehler aus: (Wie bind ich denn hier Bilder ein, anscheinend granicht):
"Im Projekt mathematik.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Medlung: 'Zugriffsverletztung bei adresse 00000000. Lesen von Adresse 00000000'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzten."


Zitat:

Naja vermutlich ist es genau diese Schleife...
Ja vieleicht, aber letztens noch hat er bei der Exception immer die 2. Schleife mit dem j als Variable makiert. Jetzt makiert er nichts mehr.

GuenterS 20. Jul 2004 08:35

Re: Textzeile in Txt auslesen
 
ganz klar du gibst Deine ausserhalb der Schleife erzeugten TStringList frei, damit ist das Object zerstört und beim neuerlichen zugriff darauf hast Du eine AccessViolation was nicht anders zu erwarten ist.


Gib die Liste erst am Ende deiner Procedure ausserhalb der Schleifen frei. Um sie zu leeren kannst Du die Methode Clear der StringListe verwenden.

Alexander Roth 20. Jul 2004 09:02

Re: Textzeile in Txt auslesen
 
Daaaaaaaaaaaaaaanke. Klappt zwar noch nicht alles wie ich es mir wünsche, doch der Fehler ist weg. Nochmals danke.
Ich werde mal weiter rumbasteln um das besch.... Wetter zu vergessen.
:hello:

Alexander Roth 25. Jul 2004 06:46

Re: Textzeile in Txt auslesen
 
Frage: Wie viel kann denn so eine Stringlist aufnehmen? Doch hoffentlich wesentlich mehr als ein Array?!!!

GuenterS 25. Jul 2004 07:57

Re: Textzeile in Txt auslesen
 
Das weiß ich nicht genau, denke aber nicht dass es mehr eher weniger ist. Das Array selber ist doch nur durch den vorhandenen Speicher begrenzt, während bei der StringList auch noch die anderen Felder mitberücksichtigt werden müssen.

Alexander Roth 25. Jul 2004 16:48

Re: Textzeile in Txt auslesen
 
Schade. Dann bringt mir dass mit der String-List ziehmlich wenig. Auserdem dauert der Process in der txt ja ewig.
Kennt nicht jemand ein schnelles Verfahren um die große Menge von primzahlen schnell und einfach zu speichern und wieder auslesen zu können??? Ein Array ist zu klein.

Ooo.. Ich eröffne leiber mal ein neues Thema.. oder??? passt ja irgendwie nicht mehr ganz so zu dem Titel hier.

scp 25. Jul 2004 17:06

Re: Textzeile in Txt auslesen
 
Zitat:

Zitat von Alexander Roth
Auserdem dauert der Process in der txt ja ewig.

Das liegt wohl vor allem daran:
Delphi-Quellcode:
    while (j < aerg)and(j< sl.count) do
      begin
        sl.loadfromfile(pfad);
Du lädst die GESAMTE Datei bei jedem Durchgang der Schleife neu, was unnötigt Zeit raubt. Dreh das ganze mal um:
Delphi-Quellcode:
    sl.loadfromfile(pfad);
    while (j < aerg)and(j< sl.count) do
      begin

Alexander Roth 26. Jul 2004 08:54

Re: Textzeile in Txt auslesen
 
Ohoooo. Klar. Bin ich blöd und überseh so was offensichtliches.
Danke.
Wenn ich den beitrag von Toxman
Zitat:

Du machst 576 mal ein readln
benutze, könnte ich doch unbegrenzt weiterrechnen mit meinen primzahlen oder????

GuenterS 26. Jul 2004 08:58

Re: Textzeile in Txt auslesen
 
Nun irgendwann wird Dein File ja auch mal zuende sein....

Alexander Roth 26. Jul 2004 09:24

Re: Textzeile in Txt auslesen
 
Ohhh :hello: :hello: :hello: Danke Leute, Danke an euch alle!!!!
Ich bastle noch ein paar Feinheiten aus. Doch das Hauptgerüst steht.
Ich stelle mein Progrämmchen dann später vielleicht mal in den Freewarebereich, wenn es fertig ist.
Als ich mit dem Programm angefangen habe wusste ich garnichts über Dateien auslesen und schreiben.

Tschau


Alexander

angos 26. Jul 2004 10:08

Re: Textzeile in Txt auslesen
 
:arrow: Kannst du bitte einmal den gesamten Sourcecode postemn
Noch besser: Häng einfach einmal die .Pas an.

Dann kann ich mir das vielleicht mal anschauen.

Ups: Das waren ja zwei Seiten :oops: Entschuldigt bitte


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz