PDA

View Full Version : Write IFS files mit fputs() API



NollW
21-05-07, 15:30
Hallo!
Ich habe Scott Klement's IFS APIs aus der Mai-Ausgabe runtergeladen und getestet. Das Beispielprogramm zum Lesen von Streamfiles (mit fgets() API)klappte auf Anhieb. Probleme habe ich beim Schreiben mit fputs().
Hat das schon jemand probiert und hat ein Snippet als Beispiel?
Satzende mit CRLF!
Ich bekomme immer einen Versatz in der Ausgabedatei, indem das CR am Ende des Satzes und das LF am Anfang der neuen Zeile steht. Ich bekomme CRLF nicht zusammen an das Satzende.
Jede Hilfe wird gerne angenommen!

kuempi von stein
21-05-07, 16:25
Hallo, die Variante mit fput usw. kenne ich gar nicht, kenne nur das mit read und write.
But anyway...
Wie fügst Du denn das Ende hinzu? Gar nicht oder so in der Art?

CONST(X'0d25')

Das müsste doch einen CRLF erzeugen?

Grussle

k.

Fuerchau
21-05-07, 18:26
fputs() schreibt nur Strings, die mit x'00' beendet sind.
fgets() liest bis zum CRLF bzw. Dateiende, ggf. mit "Pufferüberschreibung" (bekannte M$-Sicherheitslücken) wenn der Eingabepuffer zu kurz ist.

read() ist da allemal sicherer.

Ansonsten gilt natürlich:
Gibst du in ASCII/ANSI direkt aus, so sind die Codes x'0D0A' (in EBCDIC eben x'0D25') selber auszugeben.

NollW
22-05-07, 06:27
Hallo,

ich gebe x'0D0A' explitit hinter dem Text aus.
Wie ist das aber mit dem Null-terminated String? Muß man da hinter dem CRLF noch x'00' ausgeben?
Danke.

Fuerchau
22-05-07, 07:49
int fputs(const char *string, FILE *stream);


Durch die Prototyp-Deklaration "options(*string)" fügt die Runtime automatisch das X'00' an, da sie eine temporäre Kopie des Ausgabepuffers erstellt.


Ob nun x'0A' für LF der richtige Code ist, kommt auf die Open-Anweisung an.
Wenn du die Daten in EBCDIC ausgibst und auf Grund der "CCSID=1252" die Codewandlung automatisch ausführen läßt, musst du x'25' für LF (EBCDIC) ausgeben.


X'0A' kannst du nur nehmen, wenn du die Codewandlung EBCDIC->ANSI selber durchführst.

NollW
22-05-07, 12:24
Hallo,
hier mein Beispiel:
Input-Datei TEST (PF), Field is FLD1, 3 Records (CCSID = 273)ffice:office" /><O:p></O:p>
....+....1....+
AAAAAAAAAA <O:p></O:p>
BBBBBBBBBB <O:p></O:p>
CCCCCCCCCC <O:p></O:p>
<O:p> </O:p>
Output-Streamfile in Hex (CCSID = 273)<O:p></O:p>
Rec1: C1C1C1C1 C1C1C1C1 C1C10D
<O:p></O:p>
Rec2: 0AC2C2C2 C2C2C2C2 C2C2C20D

Rec3: 0AC3C3C3 C3C3C3C3 C3C3C30D
<O:p></O:p>
Rec4: 0A0D

Program Code Snippets:<O:p></O:p>
FTEST IF E DISK<O:p></O:p>
<O:p> </O:p>
D fputs PR 10I 0 ExtProc('_C_IFS_fputs') <O:p></O:p>
D string * value options(*string) <O:p></O:p>
D stream like(pFILE) value <O:p></O:p>
<O:p> </O:p>
D CRLF C Const(x'0D0A')<O:p></O:p>
D String S 64A <O:p></O:p>
<O:p></O:p>
file = fopen(%trimr(filename): 'w');<O:p></O:p>
read TEST; <O:p></O:p>
dow not %eof(TEST); <O:p></O:p>
String = FLD1 + CRLF; <O:p></O:p>
if fputs(%trim(String):file) = -1; <O:p></O:p>
leave; <O:p></O:p>
endif; <O:p></O:p>
read TEST; <O:p></O:p>
enddo; <O:p></O:p>
<O:p></O:p>
fclose(file); <O:p></O:p>
return; <O:p></O:p>

Fuerchau
22-05-07, 13:32
Die CCSID deiner Streamfile ist 273 und somit EBCDIC.
In diesem Fall ist X'25' als LF-Code auszugeben.

Ansonsten kannst du im fopen() auch erweiterte Attribute für die Codewandlung angeben.

Trotzdem gilt x'0D25' als CRLF (du arbeitest ja nun mal in EBCDIC 273) und wird dann korrekt in die IFS-Datei ausgegeben.