Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - strings als txt Datei speichern und mit Wordpad öffnen


Nilsener - Do 25.09.03 17:13
Titel: strings als txt Datei speichern und mit Wordpad öffnen
Hallo,

ich möchte Messdaten in einem Messprotokoll speichern, der Dateityp ist txt. Ich wandel die Messdaten in shortstrings und schreibe die strings nacheinander in eine txt Datei. Wenn ich dann die Datei mit Wordpad öffne, sehe ich den ersten string jedoch mit einem Steuerzeichen (schwarzes Quadrat) davor. Dann folgt der 5te string, die strings 2-4 wurden 'verschluckt'. String 6 und 7 fehlen dann auch wieder.

Wie muß ich die Strings vor dem Speichern anpassen, damit ich mit Wordpad nicht nur Müll sehe ?

Gruss Nils


Nilsener - Do 25.09.03 17:55

Nach ein paar Versuchen:

Die strings werden in Wordpad oder Microsoft Editor richtig angezeigt wenn man sie zeichenweise in einer for to do Schleife in die Datei schreibt. Nach jedem vollständigen String muß dann noch ein CR LF chr(10)+chr(13) gespeichert werden damit Wordpad oder Microsoft Editor in die nächste Zeile springt.
Reichlich umständlich wie ich finde, vielleicht gibt es bessere Lösungen.

Gruss Nils


Anonymous - Do 25.09.03 18:38

doch, klar.
z.B. so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
 x: TextFile;
begin
 assignfile(x, 'C:\bla.txt');
 rewrite(x);
 writeln(x,'etwas');
 writeln(x,'nochetwas');
 closefile(x);


Nilsener - Do 25.09.03 18:53

Das habe ich versucht, anstelle von 'etwas' und 'nochetwas' habe ich shortstrings und das produziert müll. Ich vermute, daß der String von Position String[0] bis String[length(String)] gespeichert wird und die Position 0 dabei Probleme macht da sie irgend etwas enthält das mir unbekannt ist.
Ich speichere jetzt von Position String[1] bis String[length(string)] und addiere noch CR+LF. das funktioniert dann.

Gruss Nils


Anonymous - Do 25.09.03 18:54

dann caste den shortstring doch als string..

string(variablenname)


SMI - Fr 26.09.03 04:07

Nilsener hat folgendes geschrieben:
Ich vermute, daß der String von Position String[0] bis String[length(String)] gespeichert wird und die Position 0 dabei Probleme macht da sie irgend etwas enthält das mir unbekannt ist.


Ich verstehe dein Problem nicht wirklich. Es ist immer ungemein hilfreich wenn du bei Fragen deinen Quellcode postest.
Ich gehe jetzt einfach mal vom worst case aus. Und vermute, dass du die Funktionsweise von writeln falsch werstanden hast, sowie von Short Strings keine Ahnung hast:

Der Pascal Short String ist ein max 256 byte langes Array, der als TP erbsünde in Delphi noch weiterexistiert. Er Zeichnet sich dadurch aus, dass das erste Byte die Länge angibt, also "s[0]" liefert die länge des shortstrings zurück. Wenn man auf den ganzen String zugreifen will gibt man einfach nur "s" an die Länge wird immer automatisch vom Compiler verwaltet und im ersten Byte gesetzt. Unten folgt ein Auszug aus der Delphi hilfe zu diesem Thema.

Nur nebenbei was für viel Verwirrung sorgt, andere Programmiersprachen wie z.B. C verwenden nullterminierte Strings, daher liegt die Vermutung nahe, dass ein Delphi Long String ein nullterminierter String sei. Was ein Trugschluss ist, denn ein Long String ist wegen seiner Abwärtsompatiblität zu TP ein komplexes Typengebilde.

Und hier das leicht modifizierte Beispiel von obbschtkuche:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
 x: TextFile;
 s: string[10];
 s2: string[20];
begin
 s:='234567890';
 s2:= '12345678912456';
 assignfile(x, 'C:\bla.txt');
 rewrite(x);
 writeln(x,s);
 writeln(x,s2);
 closefile(x);
end;


Delphi Hilfe hat folgendes geschrieben:

A ShortString is 0 to 255 characters long. While the length of a ShortString can change dynamically, its memory is a statically allocated 256 bytes; the first byte stores the length of the string, and the remaining 255 bytes are available for characters. If S is a ShortString variable, Ord(S[0]), like Length(S), returns the length of S; assigning a value to S[0], like calling SetLength, changes the length of S. ShortString uses 8-bit ANSI characters and is maintained for backward compatibility only.

Object Pascal supports short-string types?in effect, subtypes of ShortString?whose maximum length is anywhere from 0 to 255 characters. These are denoted by a bracketed numeral appended to the reserved word string. For example,

var MyString: string[100];

creates a variable called MyString whose maximum length is 100 characters. This is equivalent to the declarations

type CString = string[100];

var MyString: CString;

Variables declared in this way allocate only as much memory as the type requires?that is, the specified maximum length plus one byte. In our example, MyString uses 101 bytes, as compared to 256 bytes for a variable of the predefined ShortString type.
When you assign a value to a short-string variable, the string is truncated if it exceeds the maximum length for the type.
The standard functions High and Low operate on short-string type identifiers and variables. High returns the maximum length of the short-string type, while Low returns zero.