On 04/08/2010, at 7:44 AM, Darryl Freinkel wrote:
fd = open( %trimr(path)
: O_APPEND + O_TRUNC + O_CCSID + O_TextData + O_WrOnly
: M_RDONLY
: 819
: 0 );
You need to return to the open documentation and read it properly.
Parameter 1: Path - seems OK presuming your are correctly null-
terminating or the prototype is doing that for you.
Parameter 2: Open flags - Specifying both O_APPEND and O_TRUNC is a
bit pointless; if you truncate there will be no data in the file so
writes will happen at the end anyway. You don't specify O_CREAT so
this file must already exist otherwise you'll get errno 3025. If it
already exists then parameter 4 controls the data encoding.
Parameter 3: Mode - You haven't shown what value constant M_RDONLY
actually is but presuming it is some combination of *R for file owner,
group, or public then probably OK but ignored unless O_CREAT is
specified.
Parameter 4: Conversion ID - The CCSID for O_CSSID. This value is the
CCSID in which the system will provide data read from the file and in
which the system will expect data written to the file. If the file
does not exist then the system will expect you to provide data in this
CCSID. If the file does exist the system will convert between job
CCSID and this CCSID for you.
Parameter 5: Text conversion ID - The CCSID used if O_TEXT_CREAT is
specified. Ignored in your example.
Aside from he missing O_CREAT your problem appears to be caused by
your use of parameter 4.
If the file does not exist then if created (only if O_CREAT
specified) the file will be tagged with CCSID 819 **AND** your program
must supply data in CCSID 819. No data conversion will be done by the
system
If the file already exists then the system will expect your program
to supply the data in the CCSID 819 and the system will convert from
819 to the CCSID of the file.
What is happening is either:
a) The file has CCSID 819, you are writing EBCDIC data (CCSID 37) to
the file, the system does no conversion, and the data looks like crap
or
b) The file has a CCSID other than 819, you are writing EBCDIC data
(CCSID 37 to the file, the OS is converting from 819 (because you told
it that's how you'd supply data) to the file CCSID, and the data looks
like crap
You have three choices (not all of which are available on earlier
releases):
1) Use the iconv APIs to convert the data into 819 before writing to
the file
2) Open the file with O_CREAT to create the file with CCSID 819,
close the file, then open again specifying 0 for parameter 4. This
will make the system convert the data from your job CCSID to the file
CCSID allowing you to write the data in your job CCSID (likely EBCDIC
37)
3) Specify O_TEXT_CREAT and leave parameter 5 at 0. This will allow
you to write data in your job CCSID and the system will convert it to
the file CCSID
Regards,
Simon Coulter.
--------------------------------------------------------------------
FlyByNight Software OS/400, i5/OS Technical Specialists
http://www.flybynight.com.au/
Phone: +61 2 6657 8251 Mobile: +61 0411 091 400 /"\
Fax: +61 2 6657 8251 \ /
X
ASCII Ribbon campaign against HTML E-Mail / \
--------------------------------------------------------------------
As an Amazon Associate we earn from qualifying purchases.