Autor Beitrag
Dibelius
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 13.11.09 20:25 
hallo,

ich hab ein Problem mit dem Auslesen einer Textdatei. Diese ist imgrunde ähnlich strukturiert wie eine INI-File, jedoch ohne sections. Ich hab mir für das Ganze eine neue Unit und darin wiederum eine neue Klasse erstellt. Meine Überlegung war jetzt so, dass ich gleich beim Konstruktor schaue, ob die Datei schon vorhanden ist. Falls ja, soll Zeile für Zeile ausgelesen werden und jede Zeile in eine StringList geschrieben werden... also eigentlich nichts Großartiges.
In der Speicher-Routine erstelle ich eine Instanz der Klasse und weise den Dateinamen entsprechend zu (Datei existiert auch).
Hier erstmal der Code

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
INTERFACE

uses
  SysUtils, Classes, Math;

type
  TMyFile = class
  private
    FFile: TextFile;
    FFileN: string;
    FVList: TStringList;
  public
    constructor Create(const FileName: string);
    destructor Destroy; override;
    property FileName:string read FFileN write FFileN;
  end;

IMPLEMENTATION

constructor TMyFile.Create(const FileName: string);
var
  S: string;
begin
  FFileN := Filename;
  FVList := TStringList.Create;

  AssignFile(FFile, FileName);
  Rewrite(FFile);
  FVList.Clear;
  while not EOF(FFile) do // diese Zeile wird nach dem Laufzeitfehler markiert!
  begin
    ReadLn(FFile, S);
    FVList.Add(S);
  end;
  FVList.Sorted := true;
end;

destructor TMyFile.Destroy;
begin
  FVList.Free;
  CloseFile(FFile);
  inherited;
end;

Der Aufruf erfolgt nach dem Schema
ausblenden Delphi-Quelltext
1:
datei := TMyFile.Create('C:\test.cfg');					

Compilieren klappt erstmal. Allerdings tritt dann immer der Fehler "I/O-Fehler 104" zur Laufzeit auf.
Ist sicher ein ganz dummer Anfängerfehler, aber ich hoffe trotzdem, dass mir jemand helfen kann.
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Fr 13.11.09 20:33 
Wieso liest du das nicht direkt ein? :nixweiss:

ausblenden Delphi-Quelltext
1:
FVList.LoadFromFile(FileName);					


Das würde dir eine Menge ersparen.
Und wenn die Ähnlich wie eine Ini aufgebaut ist, warum benutzt du nicht gleich IniFiles?
Dann würdest du dir das Parsen sparen.
Dibelius Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 13.11.09 20:42 
LoadFromFile()... gar nicht dran gedacht. Das wäre natürlich die Lösung. Danke ^^

zum Thema: warum nicht gleich INI?
Ich hab anfangs INI-Files dafür genutzt. Ich will in der Datei Strings speichern, die u.U. sehr lang sein können. Ich hab hier ein wenig im Forum gestöbert und hab durch Zufall irgendwo gelesen, dass INI's nur eine begrenzte Kapazität haben... gut, BigINI wäre vllt eine Lösung, ka... wollte ich aber ungern nehmen, weil ich auch gleich mal mit Klassen und so herumprobieren wollte. Schließlich will ich nicht immer nur Vorgefertigtes nutzen, sondern selbst irgendwo tiefer in die Materie einsteigen.



Nachtrag:
Wenn ich jetzt LoadFromFile verwende, bekomme ich eine exception der Klasse EFOpenError mit der Meldung, dass die Datei nicht geöffnet werden kann, weil sie angeblich von einem anderen Prozess verwendet wird. :(
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 13.11.09 21:22 
Wenn das da steht ist es auch so ^^.

Entweder bist du es selbst oder ein anderes programm.
Wenn du sicher bist das es nicht wegen dir selbst ist. www.chip.de/download...locker_18414122.html
Da wird normal auch angezeigt wer es im Zugriff hat.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Fr 13.11.09 22:07 
Wenn Dir Deine INI-Dateien damit zu groß werden, dann müsstest Du das ganze zum Beispiel so machen,
indem Du Immer einem Bestimmten Eintrag immer eine extra Datei zuweist - also in etwa so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
[TextDateiVerzeichnis]
ErsterText=DateiErsterText.txt
ZweiterText=DateiZweiterText.txt
DritterText=DateiDritterText.txt
VierterText=DateiVierterText.txt
...

Dann könntest Du also dort in der INI-Datei immer nachgucken, welche Datei Du aufrufen musst, damit Du das gewünschte erhältst.
Ich denke zumindest gerade, dass das doch eigentlich so klappen müsste
...und hoffe, dass ich Dich damit nicht auf blöde Abwege bringe.