![]() |
Wie Dateizeiger auf bestimmte Position in Textdatei setzen?
Hallo,
wie kann ich den Dateizeige z.B. auf die 3. Zeile in einer Textdatei setzen? Mir ist klar, dass ich das mit der Routine "Seek" erreiche, aber was genau muss ich dort eingeben?
Delphi-Quellcode:
Vielen Dank
Seek(var F; N: Longint)
Mfg David |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Mit Seek kannst Du auf das x-te Zeichen der Datei springen. Aber da ich davon ausgehen, dass deine Zeilen unterschiedlich lang sind, wird das so nix. Ein Zeilenumbruch erfolgt in der Regel in der Windowswelt durch #10#13, oder eventuell einfach durch #13. Diese Zeichenvorkommen musst du also schon selbst suchen. Oder du lädst die Datei in eine StringList rein und greifst direkt über den Zeilenindex auf die gewünschte Zeile zu.
|
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Hi,
ich denke, dass man hier mit ReadLn schneller am Ziel ist. Cu, Frank |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Wie muss ich das angeben, dass der Zeiger auf die x.-Zeile gesetzt wird?
x möchte ich vorher Festlegen! |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
ReadLn liest immer genau eine Zeile.
|
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Zitat:
|
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Delphi-Quellcode:
VAR f : TextFile;
i : integer; s : string; [...] AssignFile(f, 'test.txt'); ResetFile(f); FOR i:=1 to (bis_zeile-1) do readln(f, s); // jetzt müsste sich der "Zeiger" in der richtigen Position befinden, // HIER KOMMEN DIE ANWEISUNGEN... [...] CloseFile(f); [edit] Eine Alternative wäre, die Datei in eine StringList zu laden, hier hat man dann Zugriff auf die einzelnen Zeilen. So z.B.
Delphi-Quellcode:
Hoffe das haut so einigermassen hin. Bin noch nicht so der Profi im Code "blind" schreiben...
MeineDatei := TSTringLIst.Create;
MeineDatei.LoadFromFile('test.txt'); // Zeile 15 Showmessage(MeineDatei[14]) // Liste fängt bei 0 an... MeineDatei.Free; SCRaT |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
wie jelly sprach, du kannst in einer textdatei nicht positionieren. du kannts nur, vorne beginnen und dann zeile für zeile durchgehen. eine textdatei lieste normal so...
Delphi-Quellcode:
da musste dann halt abbrechen, wenn du die entsprechende zeile gefunden hast. deinen zugriff solltest du entsprechend optimieren, dass du alle daten beinander hast, wenn du einmal durch deine datei durchgegangen bist um nicht ständig wieder von vorne zu beginnen.
while not eof(f) do readln(f, s);
<HTH> |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Okay :-D , werd ich mich mal durcharbeiten...viele Dank aufjedenfall erstmal für die Hilfe von euch :thumb:
|
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Zitat:
Offiziell ist es nicht möglich, da Seek delphi-intern gesperrt ist, aber wenn man sich selber ein entsprechende Seek-Funktion erstellt (siehe Forum), dann könnte man dieses dann doch machen. Nur muß man dann halt aufpassen, denn die Textfunktion von Delphi nuten einen interen Cache, welcher dann leicht durcheinanderkommen kann. Das Selbe gilt für Dateien über 2 GB Größe ... die Delphifunktionen arbeiten mit 'nem Integer, welcher auf 2 GB begrentz ist, so sind nicht alle Funktionen für über 2 GB nutzbar, es sei denn mann kümmert sich selber drum :roll: Aber damit dein Code "ganz" Sicher läuft, kommst du eigentlich besser, wenn du die Standartfunktionen nutzt und dich dann bis zur entsprechenden Stelle durchließt. ![]() alternativ könnte man es auch noch so machen (allerdings dann noch ein paar Sicherheitsabfragen mit einbauen ... so sollte es nur gehn, wenn die gewünschte Zeile 100%ig existiert) ![]()
Delphi-Quellcode:
Var PT: TPartialTextfile;
i: Int64; S: String; PT := TPartialTextfile.Create; PT.Open('Test_.pas'); i := PT.GetLineStart(100); PT.LoadPart(i, 1); S := PT.Part[0]; PT.Free; // S = die Zeile welche gleich nach Position 100 beginnt |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Okay super :-), viele Dank!
In meinen weiteren Überlegungen stellte sich mir dann folgende Frage: Wie kann ich erreichen, dass in einer beliebigen Komponente (z.B. ein Edit-Feld) das Wort/der Text aus einer zufälligen Zeile angezeigt wird? :gruebel: |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
![]() und dann einfach die Zeile auslesen und dort eintragen :angel: also z.B.
Delphi-Quellcode:
> Random(10) für 1. bis 10. Zeile
AssignFile(F, 'MeineDatei.txt');
Reset(F); For i := 0 to Random(10) do ReadLn(F, S); Close(F); Edit1.Text := S; Du kannst aber auch die Datei in ein TStringList einlesen (LoadFromFile) und dann die gewünschte Zeile dort auswählen, oder ... |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Ahhh super :thumb: ...hätte ich auch eigentlich selber drauf kommen müssen :oops:
|
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Habe noch eine Frage:
wie schaffe ich es das Random nur gerade Zahlen liefert? |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Zitat:
random(6) * 2 aufrufen. Random(6) liefert dir ja Zahlen zwischen 0 und 5. |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Als Grenze die Hälfte und dann das Ergebnis mal 2
|
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
Habe bei meinem Programm jetzt folgendes Problem...wenn am Ende die beiden Strings verglichen werden und sie übereinstimmen wird trotzdem "Falsch!" angezeigt!
Suche schon länger nach dem Fehler aber finde ihn nicht :( Findet ihn hier jemand?
Delphi-Quellcode:
var
Form1: TForm1; Zahl : Integer; Richtig: Boolean; S : String; Ergebnis : String; implementation {$R *.dfm} {******************************************************************************} procedure TForm1.FormCreate(Sender: TObject); begin Randomize; Zahl := Random (4); {Range muss die Hälfte der Vokabeln sein} Maskeaktualisieren; end; {******************************************************************************} procedure TForm1.Maskeaktualisieren; var F : Textfile; i : Integer; begin //Vokabel wird geladen!********************************************************* if OpnDlgVokabelliste.Execute = true then begin AssignFile(F, OpnDlgVokabelliste.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then begin For i := 0 to (Zahl*2) do begin ReadLn(F, S); end; CloseFile(F); EdtAusgabe.Text := S; end else EdtAusgabe.Text := 'Fehler'; end; end; {******************************************************************************} procedure TForm1.BtnEndeClick(Sender: TObject); begin Close; end; {******************************************************************************} procedure TForm1.BtnUeberpruefenClick(Sender: TObject); var F : Textfile; I : Integer; begin //Ergebnis Vokabel wird geladen************************************************* if OpnDlgVokabelliste.Execute = true then begin AssignFile(F, OpnDlgVokabelliste.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then begin For i := 0 to ((Zahl*2)+1) do begin ReadLn(F, Ergebnis); end; CloseFile(F); end; if SameText(S,Ergebnis) then {Strings werden verglichen} begin Richtig := true; end else Richtig := false; end; //Ergebnis Vokabel-Ladevorgang abgeschlossen************************************ if Richtig = true then begin EdtErgebnis.Visible := true; EdtErgebnis.Text := 'Richtig!'; end; if Richtig = false then begin EdtErgebnis.Visible := true; EdtErgebnis.Text := 'Falsch!'; end; // es wird immer "Falsch" angezeigt!! end; end. |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
wie ist denn deine vergleichsroutine definiert???
Delphi-Quellcode:
könnt doch genauso gut so heissen, oder?
if SameText(S,Ergebnis) then {Strings werden verglichen}
begin Richtig := true; end else Richtig := false; end;
Delphi-Quellcode:
if S = Ergebnis) then {Strings werden verglichen}
begin Richtig := true; end else Richtig := false; end; |
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
wie meinst du das? bei mir tritt mit beiden variationen der gleiche fehler auf, d.h. es wird immer "Falsch" angezeigt!
|
Re: Wie Dateizeiger auf bestimmte Position in Textdatei setz
@grenzgaenger: SameText prüft unabhängig von der Groß-/Kleinschreibung.
@mo_greene: prüfungen mit =true und =false solltest du dir besser abgewöhnen ... dieses könnte zu problemem führen :warn: 's gibt da schon einige nette themen hier im Forum dazu.
Delphi-Quellcode:
if SameText(S, Ergebnis) then
begin Richtig := true; end else Richtig := false;
Delphi-Quellcode:
Richtig := SameText(S, Ergebnis);
Delphi-Quellcode:
if Richtig = true then
if Richtig = false then
Delphi-Quellcode:
...
if Richtig then
if not Richtig then PS: hast du mal 'nen breakpoint auf if Richtig = true then gesetzt und nachgesehn welchen Wert Richtig hat?
Delphi-Quellcode:
hab mal einiges überarbeitet ... vorallem SameText(Trim(S), Trim(Ergebnis)) ... Trim bewirkt daß z.B. Leerzeichen keinen Einfluß auf das Ergebnis haben.
var
Form1: TForm1; Zahl : Integer; Richtig: Boolean; S : String; Ergebnis : String; implementation {$R *.dfm} {******************************************************************************} procedure TForm1.FormCreate(Sender: TObject); begin Randomize; Zahl := Random (4); {Range muss die Hälfte der Vokabeln sein} Maskeaktualisieren; end; {******************************************************************************} procedure TForm1.Maskeaktualisieren; var F : Textfile; i : Integer; begin //Vokabel wird geladen!********************************************************* if OpnDlgVokabelliste.Execute then begin AssignFile(F, OpnDlgVokabelliste.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then begin For i := 0 to Zahl * 2 do ReadLn(F, S); CloseFile(F); EdtAusgabe.Text := S; end else EdtAusgabe.Text := 'Fehler'; end; end; {******************************************************************************} procedure TForm1.BtnEndeClick(Sender: TObject); begin Close; end; {******************************************************************************} procedure TForm1.BtnUeberpruefenClick(Sender: TObject); var F : Textfile; I : Integer; begin //Ergebnis Vokabel wird geladen************************************************* if OpnDlgVokabelliste.Execute then begin AssignFile(F, OpnDlgVokabelliste.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then begin For i := 0 to Zahl * 2 + 1 do ReadLn(F, Ergebnis); CloseFile(F); end; //Ergebnis Vokabel-Ladevorgang abgeschlossen************************************ //if SameText(Trim(S), Trim(Ergebnis)) then {Strings werden verglichen} Richtig := SameText(Trim(S), Trim(Ergebnis)); {Strings werden verglichen} if Richtig then EdtErgebnis.Text := 'Richtig!' else EdtErgebnis.Text := 'Falsch!'; EdtErgebnis.Visible := true; end; end.
Delphi-Quellcode:
hier mal prüfen was in S und Ergebnis drin steht und danach eventuell nochmal nach Richtig sehn.
Richtig := SameText(Trim(S), Trim(Ergebnis));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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 by Thomas Breitkreuz