AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textfiles Verständnisfrage & Frage

Ein Thema von Grayknife · begonnen am 28. Feb 2015 · letzter Beitrag vom 2. Mär 2015
Antwort Antwort
Seite 2 von 3     12 3      
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#11

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 14:39
Müsste Delphi 2005 oder 2006 sein.

Exceptions sind Ausnahmen und keine Schleifen. Man sollte try-finally Blöcke benutzen, um Resourcen zu schützen, try-except Blöcke um spezielle Exceptions zu behandeln, aber nicht um ALLE Exceptions zu "verschlucken".

Dein Code sollte ungefähr so aussehen:

Delphi-Quellcode:
var
  Speicher: Textfile;
  GesH: Integer;
begin
  AssignFile(Speicher, 'Speicher.txt');
{$I-}
  Reset(Speicher);
{$I+}
  try
    if IOResult = 0 then
      Readln(Speicher, GesH)
    else
      GesH := 0; // oder sonstiger Standardwert
    GesZ := GesH + GesZ + 1;
    Rewrite(Speicher);
    Writeln(Speicher, GesZ);
  finally
    CloseFile(Speicher);
  end;
Erklärung:
Du musst zuerst per AssignFile der Textfile-Variable den Dateinamen zuweisen. Sonst geht gar nichts. Du kannst ja auch nicht mit dem Auto losfahren, ohne vorher den Motor anzulassen.
Per {$I-} wird der Compiler angewiesen, keine Exceptions zu generieren wenn bei Dateioperationen wie Reset Fehler auftreten (z.B. Datei existiert nicht). Mit {$I+} generiert er dann wieder Exceptions für Dateioperationen. Also deaktivieren wir das hier nur kurz für den Reset-Aufruf. Wir müssen dann aber selbst über IOResult prüfen, ob Reset erfolgreich war oder nicht. Bei Erfolg ist der Wert 0, und du kannst per Readln aus der Datei lesen. Bei Fehler wird deine GesH-Variable mit einem Standardwert initialisiert.

Rewrite öffnet die Datei dann zur Ausgabe (ein vorheriges CloseFile ist nicht erforderlich) und löscht sie dabei komplett.
Der try-finally Block hier sorgt dafür, dass CloseFile in jedem Fall aufgerufen wird, selbst wenn bei Readln, Rewrite oder Writeln Exceptions auftreten! Da du einen Integer (GesH) liest, würde Readln z.B. eine Exception erzeugen, wenn in der Datei kein Zahlenwert, sondern ein Buchstabe oder so drin steht. Wenn du diesen Fall behandeln möchtest, musst du auch um Readln einen {$I-}..{$I+} Block setzen und IOResult nach Readln prüfen...

Aber warum sich plagen und mit diesen Uralt-Routinen Dateien lesen? Es kann durchaus Gründe dafür geben, z.B. wenn man das Programm so klein wie möglich halten will, keine VCL benutzt usw. Aber normalerweise geht es einfacher. Benutze TStream und seine Nachfahren (TStringStream), oder warum nicht INI-Dateien?

Delphi-Quellcode:
uses
  IniFiles;

var
  GesZ: Integer;

procedure TForm1.Speichern;
var
  Speicher: TIniFile;
  GesH: Integer;
begin
  Speicher := TIniFile.Create('Speicher.txt');
  try
    GesH := Speicher.ReadInteger('Variablen', 'GesH', 0);
    GesZ := GesH + GesZ;
    Speicher.WriteInteger('Variablen', 'GesH', GesZ );
  finally
    Speicher.Free;
  end;
end;

Geändert von SMO ( 1. Mär 2015 um 14:46 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#12

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 16:13
Ich möchte gerne eine Variable mit Integerwert, also zb. einfach 14 extern in einer Textdatei speichern.
Ein bißchen Grundlagenwissen kann nicht schaden:
  Mit Zitat antworten Zitat
Grayknife

Registriert seit: 13. Feb 2015
Ort: Hessen
26 Beiträge
 
#13

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 17:59
@Perlsau, ja Grundlagenwissen ist immer guuuut (y)

@SMO, erstmal vielen Dank, für die ausführliche Erklärung! Tjaa, warum sich plagen.. -.-'' Da wir nichts anderes gelernt haben in der Schule Und wenn ich etwas nicht verstehe, nehme ich das, was ich verstehe siehe z.b.: http://forum.giga.de/web-entwicklung...speichern.html Und was du jetzt vorschlägst, schaut so ähnlich aus wie die letzte Möglichkeit aus dem Link. Dann schaue ich mir jetzt deinen Vorschlag genauer an unter dem Schlagwort TStringstream, ok? Und .ini-Dateien sind das nicht verschlüsselte Dateien oder sowas? . In der Schule haben wir gelernt, "Wenn du ein Programm schreiben möchtest, öffne zuerst Delphi und klicke dann auf Datei->Neu->VCL Formularanwendung". Aber wie ich jetzt rauslese, gibt es vieeel mehr Möglichkeiten mit Delphi?!
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#14

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 18:17
Aber wie ich jetzt rauslese, gibt es vieeel mehr Möglichkeiten mit Delphi?!
In der Tat

Am besten du machst es mit einer Stringliste, wobei du DateiName (String) selber festlegen mußt:
Delphi-Quellcode:
Procedure TForm1.Speichern;
Var
  Liste : TStringList;
begin
  Liste := TStringList.Create;
  Try
    Liste.Append(Edit1.Text);
    Liste.SaveToFile(DateiName);
  Finally
    Liste.Free;
  End;
end;

Geändert von Perlsau ( 1. Mär 2015 um 18:21 Uhr)
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#15

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 18:28
INI-Dateien sind reine Textdateien. Ursprünglich haben Windows-Programme sie benutzt, um INItialisierungswerte und Einstellungen zu speichern. Dann hat aber Microsoft die Entwickler dazu aufgefordert, solche Einstellungen stattdessen in der Registry zu speichern. Aber auch heute gibt es noch gute Gründe, INI-Dateien zu benutzen. Sie sind einfach editierbar und portabel (d.h. sie können zusammen mit dem Programm auf andere Rechner kopiert werden und die Einstellungen sind dort also auch sofort verfügbar).

Probier den Code doch einfach mal aus. Die erstellte Datei sollte damit so aussehen:
Code:
[Variablen]
GesH=123
"Variablen" ist der Name des Abschnitts. Es kann mehrere Abschnitte in einer Datei geben, sie brauchen eindeutige Namen. "GesH" ist der Name des Schlüssels und "123" sein Wert.

Viele Wege führen nach Rom. Aber nicht alle sind gleich gut bei einer gegebenen Problemstellung.
Du solltest dir TStream und seine Nachfahren (TFileStream, TMemoryStream, TStringStream) wirklich anschauen, aber für deine Zwecke hier (eine Zahl in eine Datei speichern und wieder auslesen) könnte TIniFile (oder TMemIniFile) die komfortabelste Lösung sein. Denn damit wird das Konvertieren deines Integers in einen String und zurück automatisch übernommen. Und wenn die Datei nicht existiert oder der Wert kein Integer ist, dann wird keine Exception ausgelöst, sondern einfach der Standardwert benutzt (der letzte Parameter von TIniFile.ReadInteger).
Mit einem Stream musst du dich selbst um solche Dinge kümmern. Du könntest natürlich auch den Binärwert des Integers in eine Datei schreiben (TFileStream.WriteBuffer), aber das wäre dann keine Textdatei mehr.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#16

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 18:44
Sorry, SMO, aber wir haben's hier mit einem Schüler zu tun, der kaum das notwendigen Grundlagenwissen mitbringt, um deinen Ausführungen folgen zu können.
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#17

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 19:02
Sorry, SMO, aber wir haben's hier mit einem Schüler zu tun, der kaum das notwendigen Grundlagenwissen mitbringt, um deinen Ausführungen folgen zu können.
Man muss die Leute nicht gleich für dumm halten. Wenn Grayknife etwas nicht versteht, das ich geschrieben habe, kann er/sie einfach nochmal nachfragen.
In der Zwischenzeit darfst du erklären, wie Grayknife die GesH oder GesZ Integer aus dem ursprünglichen Programmschnipsel mit deinem Edit1.Text kombinieren kann. Aber bitte nicht überfordern!
  Mit Zitat antworten Zitat
Grayknife

Registriert seit: 13. Feb 2015
Ort: Hessen
26 Beiträge
 
#18

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 19:46
@SMO achso, es sind trotzdem Dateien die mit .txt enden, aber "anders" gelesen werden da sie über andere Funktionen aufgerufen werden, hier mit ini&so. So wie es sich anhört sollte ich TiniFile ausprobieren, das hat dann nichts mehr mit ..Stream.. zu tun?

@Perlsau, Ja vielleicht verstehe ich nicht auf Anhieb alles, aber ich versuche es zu verstehen und umzusetzen. Und wenn ich nachfrage, ist das nicht der Faulheit halber, sondern eine Verständnisfrage! Denn meißtens ist es auf den Seiten so umständlich erklärt, dass man nicht EINE Sache versteht, obwohl man sich bemüht es zu verstehen. Und wenn man anfängt zu hinterfragen, warum ich genauer nachfrage und nicht selber google, dann würde all das hier sinnlos sein, alles was uns umgibt (denke ich mir jedenfalls)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#19

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 20:17
Man muss die Leute nicht gleich für dumm halten.
Sorry, aber ich habe niemanden für dumm gehalten. Du darfst deinen Unterstellungsversuch daher gerne wieder einstecken.

Wenn Grayknife etwas nicht versteht, das ich geschrieben habe, kann er/sie einfach nochmal nachfragen. In der Zwischenzeit darfst du erklären, wie Grayknife die GesH oder GesZ Integer aus dem ursprünglichen Programmschnipsel mit deinem Edit1.Text kombinieren kann. Aber bitte nicht überfordern!
Das war ein Beispiel. Beispiele sind keine fix&fertigen Quelltexte.

@Perlsau, Ja vielleicht verstehe ich nicht auf Anhieb alles, aber ich versuche es zu verstehen und umzusetzen. Und wenn ich nachfrage, ist das nicht der Faulheit halber, sondern eine Verständnisfrage! Denn meißtens ist es auf den Seiten so umständlich erklärt, dass man nicht EINE Sache versteht, obwohl man sich bemüht es zu verstehen. Und wenn man anfängt zu hinterfragen, warum ich genauer nachfrage und nicht selber google, dann würde all das hier sinnlos sein, alles was uns umgibt (denke ich mir jedenfalls)
Es hat doch keiner gefragt, warum du genauer nachfragst, und es hat dich auch keiner aufgefordert, selber zu googlen. Den zweiten Halbsatz mit dem "sinnlos" hab ich leider nicht einordnen können.

Okay, nicht meine Ebene, ich blende mich hier aus.
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#20

AW: Textfiles Verständnisfrage & Frage

  Alt 1. Mär 2015, 20:19
Richtig, TIniFile hat nichts mit TStream zu tun. Deine ursprüngliche Herangehensweise mit AssignFile, Reset, Rewrite, Readln und Writeln funktioniert so schon seit über 30 Jahren, seit dem ursprünglichen Turbo Pascal, das Delphis Vorfahre war. Die hier vorgeschlagenen Lösungen mit TIniFile, TStream und auch TStringList sind alle "moderner" und basieren auf sogenannten Klassen/Objekten. Aber hier jetzt die Details objektorientierter Programmierung zu erörtern ginge in der Tat zu weit. Wenn du die alte Herangehensweise nicht benutzen musst, dann können Klassen bequemer sein.

Ini-Dateien haben gewöhnlich die Dateiendung .ini, also z.B. "Speicher.ini", aber es sind immer Textdateien, also ist es kein Problem auch .txt zu benutzen.

Wie von mir angedeutet ist der Code von Perlsau unvollständig, würde aber prinzipiell auch funktionieren. Bei ihm fehlt das Lesen aus der Datei sowie die Typumwandlung von string nach Integer und umgekehrt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz