Xref: utzoo comp.lang.c:11809 comp.os.vms:7979
Path: utzoo!utgpu!attcan!uunet!yale!cmcl2!rna!marc
From: marc@rna.UUCP (Marc Johnson)
Newsgroups: comp.lang.c,comp.os.vms
Subject: VMS C file type and stdio - help!
Message-ID: <196@rna.UUCP>
Date: 10 Aug 88 18:56:48 GMT
Reply-To: marc@rna.UUCP (Marc Johnson)
Organization: Rockefeller University Neurobiology
Lines: 50

Posting this for a friend in Israel.
Any responses would be appreciated and should be e-mailed to:
rna!marc@ROCKVAX  or  marc%rna@rockefeller.edu.

------------------------------------------------------------------------------
I am trying to write a VMS C program that takes some data files on the
microVax and then converts them into my private binary format.  So far this
seemingly trivial task has taken a week. I won't go into all of the details,
but the problem is creating a binary file.  VMS doesn't just have files,
it has file types.  One must choose a file type, and then put data in the
file according to the rules and limits of that type.  What I want to do is
the following:

        1. Use the C standard I/O calls (fopen, fwrite, fclose) to
	   write a stream of binary bytes into a file.
        2. Use ftell to find out where I am in the file.
        3. Use fseek to move to a new position in the file.
        4. Create a file which kermit can access and transmit literally,
	   meaning that the byte sequence on the VMS system then appears
	   on the remote system.

I have tried most of the VMS file types, and I have not yet found one that
does what I want (STDIO binary files):

a. Using the default STDIO file type, stmlf (stream lf), the file is created
   perfectly, but kermit can't send it, because even when I tell kermit that
   the file is binary, it expands LF to CR-LF.  Also with some files, their
   internal data is such that kermit fails, because the VAX record management
   software (rms) doesn't encounter a LF character during a read of reclen
   characters.
b. Using the file type fixed, fwrite fails to put anything into the file.
c. Using the file type stm (stream), every four bytes are followed by CR-LF.
d. Using the file type udf (undefined), the file is written correctly, but
   ftell works incorrectly, and fwrites following an fseek fail to work.
e. I haven't tried var and vfc file types, because I understand from talking
   to DEC support engineers that they put extra stuff in the file to delimit
   my "records."

By the way, I am creating these various file types using the extra rms
parameters of fopen: fopen("test.dat", "w+", "rfm=udf").

We have been asking DEC about this problem, and in three days, I have yet to
speak to anyone who has ever programmed in VMS C. They keep asking me what
type of records I want to write, and I keep saying I want to use STDIO (which
they have never heard of) to write a file containing binary bytes.
------------------------------------------------------------------------------

Thanks in advance, netters!

Marc Johnson for Kaare Christian