fileinfo.cms
资源名称:unzip540.zip [点击查看]
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:10k
源码类别:
压缩解压
开发平台:
MultiPlatform
- [Quoting from a C/370 manual, courtesy of Carl Forde.]
- C/370 supports three types of input and output: text streams, binary
- streams, and record I/O. Text and binary streams are both ANSI
- standards; record I/O is a C/370 extension.
- [...]
- Record I/O is a C/370 extension to the ANSI standard. For files
- opened in record format, C/370 reads and writes one record at a
- time. If you try to write more data to a record than the record
- can hold, the data is truncated. For record I/O, C/370 only allows
- the use of fread() and fwrite() to read and write to the files. Any
- other functions (such as fprintf(), fscanf(), getc(), and putc())
- fail. For record-orientated files, records do not change size when
- you update them. If the new data has fewer characters than the
- original record, the new data fills the first n characters, where
- n is the number of characters of the new data. The record will
- remain the same size, and the old characters (those after) n are
- left unchanged. A subsequent update begins at the next boundary.
- For example, if you have the string "abcdefgh":
- abcdefgh
- and you overwrite it with the string "1234", the record will look
- like this:
- 1234efgh
- C/370 record I/O is binary. That is, it does not interpret any of
- the data in a record file and therefore does not recognize control
- characters.
- The record model consists of:
- * A record, which is the unit of data transmitted to and from a
- program
- * A block, which is the unit of data transmitted to and from a
- device. Each block may contain one or more records.
- In the record model of I/O, records and blocks have the following
- attributes:
- RECFM Specifies the format of the data or how the data is organized
- on the physical device.
- LRECL Specifies the length of logical records (as opposed to
- physical ones).
- BLKSIZE Specifies the length of physical records (blocks on the
- physical device).
- Opening a File by Filename
- The filename that you specify on the call to fopen() or freopen()
- must be in the following format:
- >> ----filename---- ----filetype--------------------
- | | | |
- --.-- -- --filemode--
- | |
- --.--
- where
- filename is a 1- to 8-character string of any of the characters,
- A-Z, a-z, 0-9, and +, -, $, #, @, :, and _. You can separate it
- from the filetype with one or more spaces, or with a period.
- [Further note: filenames are fully case-sensitive, as in Unix.]
- filetype is a 1- to 8-character string of any of the characters,
- A-Z, a-z, 0-9, and +, -, $, #, @, :, and _. You can separate it
- from the filemode with one or more spaces, or with a period. The
- separator between filetype and filemode must be the same as the
- one between filename and filetype.
- filemode is a 1- to 2-character string. The first must be any of
- the characters A-Z, a-z, or *. If you use the asis parameter on
- the fopen() or freopen() call, the first character of the filemode
- must be a capital letter or an asterisk. Otherwise, the function
- call fails. The second character of filemode is optional; if you
- specify it, it must be any of the digits 0-6. You cannot specify
- the second character if you have specified * for the first one.
- If you do not use periods as separators, there is no limit to how
- much whitespace you can have before and after the filename, the
- filetype, and filemode.
- Opening a File without a File Mode Specified
- If you omit the file mode or specify * for it, C/370 does one
- of the following when you call fopen() or freopen():
- * If you have specified a read mode, C/370 looks for the named file
- on all the accessed readable disks, in order. If it does not find
- the file, the fopen() or freopen() call fails.
- * If you have specified any of the write modes, C/370 writes the file
- on the first writable disk you have accessed. Specifying a write
- mode on an fopen() or freopen() call that contains the filename of
- an existing file destroys that file. If you do not have any
- writable disks accessed, the call fails.
- fopen() and freopen() parameters
- recfm
- CMS supports only two RECFMs, V and F. [note that MVS supports
- 27(!) different RECFMs.] If you do not specify the RECFM for a
- file, C/370 determines whether is is in fixed or variable format.
- lrecl and blksize
- For files in fixed format, CMS allows records to be read and
- written in blocks. To have a fixed format CMS file treated as a
- fixed blocked CMS file, you can open the file with recfm=fb and
- specify the lrecl and blksize. If you do not specify a recfm on
- the open, the blksize can be a multiple of the lrecl, and the
- file is treated as if it were blocked.
- For files in variable format, the CMS LRECL is different from the
- LRECL for the record model. In the record model, the LRECL is
- equal to the data length plus 4 bytes (for the record descriptor
- word), and the BLKSIZE is equal to the LRECL plus 4 bytes (for
- the block descriptor word). In CMS, BDWs and RDWs do not exist,
- but because CMS follows the record model, you must still account
- for them. When you specify V, you must still allocate the record
- descriptor word and block descriptor word. That is, if you want
- a maximum of n bytes per record, you must specify a minimum LRECL
- of n+4 and a minimum BLKSIZE of n+8.
- When you are appending to V files, you can enlarge the record size
- dynamically, but only if you have not specified LRECL or BLKSIZE
- on the fopen() or freopen() command that opened the file.
- type
- If you specify this parameter, the only valid value for CMS disk
- files is type =record. This opens a file for record I/O.
- asis
- If you use this parameter, you can open files with mixed-case
- filenames such as JaMeS dAtA or pErCy.FILE. If you specify this
- parameter, the file mode that you specify must be a capital letter
- (if it is not an asterisk); otherwise; the function call fails and
- the value returned is NULL.
- Reading from Record I/O Files
- fread() is the only interface allowed for reading record I/O files.
- Each time you call fread() for a record I/O file, fread() reads
- one record from the system. If you call fread() with a request for
- less than a complete record, the requested bytes are copied to your
- buffer, and the file position is set to the start fo the next
- record. If the request is for more bytes that are in the record,
- one record is read and the position is set to the start of the next
- record. C/370 does not strip any blank characters or interpret any
- data.
- fread() returns the number of items read successfully, so if you
- pass a size argument equal to 1 and a count argument equal to the
- maximum expected length of the record, fread() returns the length,
- in bytes, of the record read. If you pass a size argument equal
- to the maximum expected length of the record, and a count argument
- equal to 1, fread() returns either 0 or 1, indicating whether a
- record of length size read. If a record is read successfully but
- is less than size bytes long, fread() returns 0.
- Writing to Record I/O Files
- fwrite() is the only interface allowed for writing to a file
- opened for record I/O. Only one record is written at a time. If
- you attempt to write more new data than a full record can hold or
- try to update a record with more data than it currently has, C/370
- truncates your output at the record boundary. When C/370 performs
- a truncation, it sets errno and raises SIGIOERR, if SIGIOERR is not
- set to SIG_IGN.
- When you are writing new records to a fixed-record I/O file, if you
- try to write a short record, C/370 pads the record with nulls out
- to LRECL.
- At the completion of an fwrite(), the file position is at the start
- of the next record. For new data, the block is flushed out to the
- system as soon as it is full.
- fldata() Behavior
- When you call the fldata() function for an open CMS minidisk file,
- it returns a data structure that looks like this:
- struct __filedata {
- unsigned int __recfmF : 1, /* fixed length records */
- __recfmV : 1, /* variable length records */
- __recfmU : 1, /* n/a */
- __recfmS : 1, /* n/a */
- __recfmBlk : 1, /* n/a */
- __recfmASA : 1, /* text mode and ASA */
- __recfmM : 1, /* n/a */
- __dsorgPO : 1, /* n/a */
- __dsorgPDSmem : 1, /* n/a */
- __dsorgPDSdir : 1, /* n/a */
- __dsorgPS : 1, /* sequential data set */
- __dsorgConcat : 1, /* n/a */
- __dsorgMem : 1, /* n/a */
- __dsorgHiper : 1, /* n/a */
- __dsorgTemp : 1, /* created with tmpfile() */
- __dsorgVSAM : 1, /* n/a */
- __reserve1 : 1, /* n/a */
- __openmode : 2, /* see below 1 */
- __modeflag : 4, /* see below 2 */
- __reserve2 : 9, /* n/a */
- char __device; __DISK
- unsigned long __blksize, /* see below 3 */
- __maxreclen; /* see below 4 */
- unsigned short __vsamtype; /* n/a */
- unsigned long __vsamkeylen; /* n/a */
- unsigned long __vsamRKP; /* n/a */
- char * __dsname; /* fname ftype fmode */
- unsigned int __reserve4; /* n/a */
- /* note 1: values are: __TEXT, __BINARY, __RECORD
- note 2: values are: __READ, __WRITE, __APPEND, __UPDATE
- these values can be added together to determine
- the return value; for example, a file opened with
- a+ will have the value __READ + __APPEND.
- note 3: total block size of the file, including ASA
- characters as well as RDW information
- note 4: maximum record length of the data only (includes
- ASA characters but excludes RDW information).
- */
- };