Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Problem mit writeln (Text erstellen) (https://www.delphipraxis.net/169000-problem-mit-writeln-text-erstellen.html)

Boyington 22. Jun 2012 13:15

Problem mit writeln (Text erstellen)
 
Hallo Zusammen,
ich möchte in Delphi eine Text-Datei erstellen und die Abstände und zugehörige x, y Koordinaten sind drin, Format wie folgendes (nur Beispiel-->x, y: integer; MiniAbstand:real; x:0-9, y:0-19, also 10x20), ABER erste Zeile ("x y Abstand") wird in dieser Textdatei NICHT angezeigt

x y Abstand
0 19 1.435
1 19 2.312
2 19 1.112
3 19 5.123
.. .. ...
8 19 1.231
9 19 3.123
0 18 2.123
1 18 6.123
2 18 2.345
3 18 1.234
.. .. ...
8 18 3.112
9 18 4.567
0 17 2.567
1 17 2.111
2 17 6.123
.. .. ...
9 17 7.123
0 16 2.678
1 16 3.345
2 16 3.890
.. .. ...
.. .. ...
0 5 7.001
1 5 2.567
2 5 3.345
.. .. ...
9 5 1.113
0 4 2.123
1 4 3.321
.. .. ...
0 0 2.234
1 0 1.567
2 0 5.132
.. .. ...
7 0 7.123
8 0 1.127
9 0 2.980

Hier sind die Code
Delphi-Quellcode:
Type
 TAbstand = record
 Nr: integer;
 Abs: real;
 end;
.
.
.
var
 Abstaende: array of array of TAbstand;
.
.
.
procedure TForm1.Button4Click(Sender: TObject);
var
 MiniAbstand:real;
 Nummer:integer;
 i, j:integer;
 F:Textfile;
begin
  AssignFile(F, 'List_Abstand.txt');
 
 for i:=0 to 19 do
  begin
    for j:=0 to 9 do
    begin
     Nummer:=Abstand(MiniAbstand,Dreiecke);
     Abstaende[i,j].Nr:=Nummer;
     
      if Nummer > 0 then
        Abstaende[i,j].Abs:=MiniAbstand
      else
        Abstaende[i,j].Abs:=1000;

      Writeln(F,j,' ',19-i,' ',Abstaende[i,j].Abs);

    end;
  end;
end;
:
Funktion 'Abstand' ist von mir selbst geschrieben, hier j entspricht x in Textdatei, und i entspricht y.

Compile ist ganz in Ordnung, ohne Fehlermeldung, ab wenn ich das Programm durchführte, bekommen ich "I/O Error 103", wo kann der Fehler liegen?

Vielen Dank!

Gruss
Lee

jaenicke 22. Jun 2012 13:26

AW: Problem mit writeln (Text erstellen)
 
Du öffnest die Datei nirgends, du verbindest deine Variable F nur mit dem Dateinamen. Und wo du die erste Zeile schreiben willst, sehe ich auch nirgends.

Siehe Doku:
http://docwiki.embarcadero.com/Libra...tem.AssignFile
Oder andere Seiten:
http://www.delphibasics.co.uk/RTL.asp?Name=AssignFile

DeddyH 22. Jun 2012 13:34

AW: Problem mit writeln (Text erstellen)
 
Mit einer Stringliste ginge das einfacher.

p80286 22. Jun 2012 14:18

AW: Problem mit writeln (Text erstellen)
 
Wenn ich Jaenicke noch etwas ergänzen dürfte,
das
Delphi-Quellcode:
CloseFile(f)
fehlt ebenfalls.
Ist (war) beliebte Fehlerursache für zu kurze Textdateien.

@DeddyH
Er will eben alle Funktionalitäten erlernen.
Und für Log-Files gibt es meiner Meinung nach nichts besseres als
Assignfile,append,writeln,closefile
(ja das ist wohl kein Logfile, aber es hat zusehr gejuckt)

Gruß
K-H

himitsu 22. Jun 2012 14:55

AW: Problem mit writeln (Text erstellen)
 
Zitat:

Zitat von p80286 (Beitrag 1172066)
Und für Log-Files gibt es meiner Meinung nach nichts besseres als
Assignfile,append,writeln,closefile

Dem würde ich nicht zustimmen.

"nichts Einfacheres" würde stimmen, abgesehn von speziell dafür erstellen Klassen/Bibliotheken, also rein auf die "einfachen"/direkten Dateizugriffsfunktionen bezogen.

"Besseres" gibt es alle Male, vom Caching her sind Streams besser und von der Funktionalität die spezialisierten Klassen.

p80286 22. Jun 2012 15:20

AW: Problem mit writeln (Text erstellen)
 
Wird zwar etwas OT aber warum
Zitat:

vom Caching her sind Streams besser
.
a) ich müßte bei Strings noch das CRLF hinterher schieben?
b) sogar ohne
Delphi-Quellcode:
settextbuf
geht es (unter windows)ganz gut.

Liege ich da so falsch?

Gruß
K-H

Klaus01 22. Jun 2012 15:31

AW: Problem mit writeln (Text erstellen)
 
.. ich möchte dann mal die Folgende Klassen TStreamWriter
und TStreamReader in den Raum werfen.

Delphi-Referenz durchsuchenTStreamWriter.WriteLine
Delphi-Referenz durchsuchenTStreamReader.ReadLine

Grüße
Klaus

p80286 22. Jun 2012 16:32

AW: Problem mit writeln (Text erstellen)
 
Zu kurz geworfen,in D7 unbekannt,
wie wäre es mit TStringStream ?
aber da fehlt mir die Angabe der Datei aus der ich lesen will.

Gruß
K-H

himitsu 22. Jun 2012 16:45

AW: Problem mit writeln (Text erstellen)
 
TStringStream + TFileStream




Text-Dateien haben auch ohne SetTextBuf schon einen komischen 128 Byte-Puffer.

Das paßt nichtmal im Geringsten zur ClusterSize der Partitionen oder zur SectorSize der Datenträger.

Beim Lesen ist ein Puffer OK, aber wozu beim Schreiben?
Die Daten gehen sowieso nochmal durch die WFC (Windows File Cache ... das Teil, welches den RAM voll macht) und dann nochmal durch verschiedenste Caches.

Wenn das Programm abstürtzt, sind diese Daten weg, was geade bei LogDateien etwas blöd ist, vorallem wenn man das Warum wissen will.

Delphi-Quellcode:
var
  F: TextFile;
  B: Byte; // für LogDateien so klein wie möglich (0 ist leider nicht möglich) und ansonsten wäre es ein bissl größer nicht schlecht.
begin
  AssignFile(F, 'Text.dat', CP_UTF8); // Ja, wir können jetzt sogar unicode, auch wenn die BOM nicht automatisch rein kommt.
  System.SetTextBuf(F, B);
  Rewrite(F);
  WriteLn(F, '123456');
  CloseFile(F);

p80286 22. Jun 2012 17:01

AW: Problem mit writeln (Text erstellen)
 
Zitat:

Zitat von himitsu (Beitrag 1172076)
Wenn das Programm abstürtzt, sind diese Daten weg, was geade bei LogDateien etwas blöd ist, vorallem wenn man das Warum wissen will.

Genau das ist ja der Grund für mich da mal auf writeln zurück zu greifen.
Nach meinem Kenntnisstand wird der Buffer bei einem Closefile weggeschrieben, also seh ich da keine Gefahr des Datenverlustes (natürlich für jede Zeile das append,writeln,closefile)
Was den Buffer angeht und den Tstream vielleicht komm ich am WE mal dazu etwas zu Teste ob es da signifikante Geschwindigkeitsunterschiede gibt.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 Uhr.
Seite 1 von 2  1 2      

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