|
|
1.1 ! root 1: .\" Copyright (c) 1980 Regents of the University of California. ! 2: .\" All rights reserved. The Berkeley software License Agreement ! 3: .\" specifies the terms and conditions for redistribution. ! 4: .\" ! 5: .\" @(#)f77IO.ms 5.4 (Berkeley) 4/28/86 ! 6: .\" ! 7: .EH 'PS1:3-%''Introduction to the f77 I/O Library' ! 8: .OH 'Introduction to the f77 I/O Library''PS1:3-%' ! 9: .de Fo ! 10: Fortran\\$1 ! 11: .. ! 12: .de Sm ! 13: \s-1\\$1\s0 ! 14: .. ! 15: .\" ! 16: .\" Nh macro - same as NH but also saves heading for table of contents ! 17: .\" Nh usage: Nh level string, e.g.: .Nh 2 "Calculator Sample" ! 18: .de Nh ! 19: .NH \\$1 ! 20: \\$2 ! 21: .XS ! 22: .if '2'\\$1' .ti .25i ! 23: .if '3'\\$1' .ti .5i ! 24: \\*(SN \\$2 ! 25: .XE ! 26: .PP ! 27: .. ! 28: .ND "" ! 29: .\" .nr ll 7.0i ! 30: .\" .nr LL 7.0i ! 31: .\" .po 0.0i ! 32: .\" .rm PT ! 33: .\" .rm BT ! 34: .\".RP ! 35: .TL ! 36: Introduction to the f77 I/O Library ! 37: .AU ! 38: David L. Wasley ! 39: .AU ! 40: J. Berkman ! 41: .AI ! 42: University of California, Berkeley ! 43: Berkeley, California 94720 ! 44: .AB ! 45: The f77 I/O library, libI77.a, ! 46: includes routines to perform all of the standard types of ! 47: .Fo ! 48: input and output specified in the ! 49: .Sm ANSI ! 50: 1978 ! 51: .Fo ! 52: standard. ! 53: The I/O Library was written originally by Peter J. Weinberger at Bell Labs. ! 54: Where the original implementation was incomplete, ! 55: it has been rewritten to more closely implement the standard. ! 56: Where the standard is vague, ! 57: we have tried to provide flexibility within the constraints of the ! 58: .UX ! 59: operating system. ! 60: A number of logical extensions and enhancements have been provided ! 61: such as the use of the C stdio library routines to provide ! 62: efficient buffering for file I/O. ! 63: .sp 2 ! 64: .LP ! 65: Revised September, 1985 ! 66: .AE ! 67: .LP ! 68: .\" page 2 is allocated to the table of contents ! 69: .pn 3 ! 70: .bp ! 71: .Nh 1 "Fortran I/O" ! 72: The requirements of the ! 73: .Sm ANSI ! 74: standard impose significant overhead ! 75: on programs that do large amounts of I/O. Formatted I/O can be ! 76: very ``expensive'' while direct access binary I/O is usually very efficient. ! 77: Because of the complexity of ! 78: .Fo ! 79: I/O, ! 80: some general concepts deserve clarification. ! 81: .Nh 2 "Types of I/O and logical records" ! 82: There are four forms of I/O: ! 83: .B formatted, ! 84: .B unformatted, ! 85: .B list\ directed, ! 86: and ! 87: .B namelist. ! 88: The last two are ! 89: related to formatted but do not obey all the rules for formatted I/O. ! 90: There are two types of ``files'': ! 91: .B external ! 92: and ! 93: .B internal ! 94: and two modes of access to files: ! 95: .B direct ! 96: and ! 97: .B sequential. ! 98: The definition of a logical record depends upon the ! 99: combination of I/O form, file type, and access mode specified by the ! 100: .Fo ! 101: I/O statement. ! 102: .Nh 3 "Direct access external I/O" ! 103: A logical record in a ! 104: .B direct ! 105: access ! 106: .B external ! 107: file is a string of bytes ! 108: of a length specified when the file is opened. ! 109: Read and write statements must not specify logical records longer than ! 110: the original record size definition. Shorter logical records are allowed. ! 111: .B Unformatted ! 112: direct writes leave the unfilled part of the record undefined. ! 113: .B Formatted ! 114: direct writes cause the unfilled record to be padded with blanks. ! 115: .Nh 3 "Sequential access external I/O" ! 116: Logical records in ! 117: .B sequentially ! 118: accessed ! 119: .B external ! 120: files may be of arbitrary ! 121: and variable length. ! 122: Logical record length for ! 123: .B unformatted ! 124: sequential files is determined by ! 125: the size of items in the iolist. ! 126: The requirements of this form of I/O cause the external physical ! 127: record size to be somewhat larger than the logical record size. ! 128: For ! 129: .B formatted ! 130: write statements, logical record length is determined by ! 131: the format statement interacting with the iolist at execution time. ! 132: The ``newline'' character is the logical record delimiter. ! 133: Formatted sequential access causes one or more logical records ! 134: ending with ``newline'' characters to be read or written. ! 135: .Nh 3 "List directed and namelist sequential external I/O" ! 136: Logical record length for ! 137: .B list\ directed ! 138: and ! 139: .B namelist ! 140: I/O is relatively meaningless. ! 141: On output, the record length is dependent on the magnitude of the ! 142: data items. ! 143: On input, the record length is determined by the data types and the file ! 144: contents. ! 145: By ANSI definition, a slash, ``/'', terminates execution of a ! 146: list directed input operation. ! 147: Namelist input is terminated by ``&end'' or ``$end'' (depending on whether ! 148: the character before the namelist name was ``&'' or ``$''). ! 149: .Nh 3 "Internal I/O" ! 150: The logical record length for an ! 151: .B internal ! 152: read or write is the length of the ! 153: character variable or array element. Thus a simple character variable ! 154: is a single logical record. A character variable array is similar to ! 155: a fixed length direct access file, and obeys the same rules. ! 156: .B Unformatted ! 157: and ! 158: .B namelist ! 159: I/O are not allowed on ``internal'' files. ! 160: .Nh 2 "I/O execution" ! 161: Note that each execution of a ! 162: .Fo ! 163: .B unformatted ! 164: I/O statement causes a single ! 165: logical record to be read or written. Each execution of a ! 166: .Fo ! 167: .B formatted ! 168: I/O statement causes one or more logical records to be read or written. ! 169: .PP ! 170: A slash, ``/'', will terminate assignment of ! 171: values to the input list during ! 172: .B list\ directed ! 173: input and the remainder of the current input line is skipped. ! 174: The standard is rather vague on this point but seems to require that ! 175: a new external logical record be found at the start of any formatted ! 176: input. Therefore data following the slash is ignored and may be used ! 177: to comment the data file. ! 178: .PP ! 179: .B "Direct access list directed" ! 180: I/O is not allowed. ! 181: .B "Unformatted internal" ! 182: I/O is not allowed. ! 183: .B Namelist ! 184: I/O is allowed only with ! 185: .B "external sequential" ! 186: files. ! 187: All other flavors of I/O are allowed, although some are not part of the ! 188: .Sm ANSI ! 189: standard. ! 190: .PP ! 191: Any I/O statement may include an ! 192: .B err= ! 193: clause to specify an alternative branch to be taken on errors ! 194: and/or an ! 195: .B iostat= ! 196: clause to return the specific error code. ! 197: Any error detected during I/O processing will cause the program to abort ! 198: unless either ! 199: .B err= ! 200: or ! 201: .B iostat= ! 202: has been specificed in the program. ! 203: Read statements may include ! 204: .B end= ! 205: to branch on end-of-file. ! 206: The end-of-file indication for that logical unit may be reset with ! 207: a \fBbackspace\fP statement. ! 208: File position and the value of I/O list items is undefined following an error. ! 209: .sp 1 ! 210: .Nh 1 "Implementation details" ! 211: Some details of the current implementation may be useful in understanding ! 212: constraints on ! 213: .Fo ! 214: I/O. ! 215: .Nh 2 "Number of logical units" ! 216: Unit numbers must be in the range 0 \- 99. ! 217: The maximum number of logical units that a program may have open at one ! 218: time is the same as the ! 219: .UX ! 220: system limit, currently 48. ! 221: .Nh 2 "Standard logical units" ! 222: By default, logical units 0, 5, and 6 ! 223: are opened to ``stderr'', ``stdin'', and ``stdout'' respectively. ! 224: However they can be re-defined with an ! 225: .B open ! 226: statement. ! 227: To preserve error reporting, it is an error to close logical unit 0 ! 228: although it may be reopened to another file. ! 229: .PP ! 230: If you want to open the default file name for any preconnected logical unit, ! 231: remember to ! 232: .B close ! 233: the unit first. ! 234: Redefining the standard units may impair normal console I/O. ! 235: An alternative is to ! 236: use shell re-direction to externally re-define the above units. ! 237: To re-define default blank control or format of the standard input or output ! 238: files, use the ! 239: .B open ! 240: statement specifying the unit number and no ! 241: file name (see \(sc\|2.4). ! 242: .PP ! 243: The standard units, 0, 5, and 6, are named internally ``stderr'', ``stdin'', ! 244: and ``stdout'' respectively. ! 245: These are not actual file names and can not be used for opening these units. ! 246: .B Inquire ! 247: will not return these names and will indicate ! 248: that the above units are not named unless they have been opened to real files. ! 249: The names are meant to make error reporting more meaningful. ! 250: .Nh 2 "Vertical format control" ! 251: Simple vertical format control is implemented. The logical unit must be opened ! 252: for sequential access with ! 253: .B "form = \(fmprint\(fm" ! 254: (see \(sc\|3.2). ! 255: Control codes ``0'' and ``1'' are replaced in the output file ! 256: with ``\\n'' and ``\\f'' respectively. ! 257: The control character ``+'' is not implemented and, like ! 258: any other character in the first position of a record ! 259: written to a ``print'' file, is dropped. ! 260: The ! 261: .B "form = \(fmprint\(fm" ! 262: mode does not recognize vertical format control for ! 263: .B "direct formatted, list directed," ! 264: or ! 265: .B "namelist" ! 266: output. ! 267: .PP ! 268: An alternative is to use ! 269: the filter \fIfpr\fP(1) for vertical format control. ! 270: It replaces ``0'' and ``1'' by ! 271: ``\\n'' and ``\\f'' respectively, and implements the ``+'' control code. ! 272: Unlike ! 273: .B "form = \(fmprint\(fm" ! 274: which drops unrecognized form control characters, \fIfpr\fP copies those ! 275: characters to the output file. ! 276: .Nh 2 "File names and the open statement" ! 277: A file name may be specified in an \fBopen\fP statement for the ! 278: logical unit. ! 279: If a logical unit is opened by an \fBopen\fP statement which does ! 280: not specify a file name, or it is opened implicitly by the execution ! 281: of a \fBread\fP, \fBwrite\fP, or \fBendfile\fP ! 282: statement, then the default file name is ! 283: .I fort.N ! 284: where ! 285: .I N ! 286: is the logical unit number. ! 287: Before opening the file, the library checks for an environment ! 288: variable with a name identical to the tail of the ! 289: file name with periods removed.\(dg ! 290: .FS ! 291: \(dgPeriods are deleted because they can not be part of environment variable names in the Bourne shell. ! 292: .FE ! 293: If it finds such an environment variable, it uses its value ! 294: as the actual name of the file. ! 295: For example, a program containing: ! 296: .DS ! 297: open(32,file=\(fm/usr/guest/census/data.d\(fm) ! 298: read(32,100) vec ! 299: write(44) vec ! 300: .DE ! 301: normally will read from \fI/usr/guest/census/data.d\fP and write to ! 302: \fIfort.44\fP in the current directory. ! 303: If the environment variables \fIdatad\fP and \fIfort44\fP are set, ! 304: e.g.: ! 305: .DS ! 306: % setenv datad mydata ! 307: % setenv fort44 myout ! 308: .DE ! 309: in the C shell or: ! 310: .DS ! 311: $ datad=mydata ! 312: $ fort44=myout ! 313: $ export datad fort44 ! 314: .DE ! 315: in the Bourne shell, then the program will read from \fImydata\fP and ! 316: write to \fImyout\fP. ! 317: .PP ! 318: An ! 319: .B open ! 320: statement need not specify a file name. If it refers to a logical ! 321: unit that is already open, the ! 322: .B blank= ! 323: and ! 324: .B form= ! 325: specifiers may be ! 326: redefined without affecting the current file position. ! 327: Otherwise, if ! 328: .B "status = \(fmscratch\(fm" ! 329: is specified, a temporary file with a ! 330: name of the form ! 331: .I tmp.FXXXXXX ! 332: will be opened, ! 333: and, by default, will be deleted when closed or during ! 334: termination of program execution. ! 335: .PP ! 336: It is an error to try to open an existing file with ! 337: .B "status = \(fmnew\(fm" ! 338: \&. ! 339: It is an error to try to open a nonexistent file with ! 340: .B "status = \(fmold\(fm" ! 341: \&. ! 342: By default, ! 343: .B "status = \(fmunknown\(fm" ! 344: will be assumed, and a file will be created if necessary. ! 345: .PP ! 346: By default, files are positioned ! 347: at their beginning upon opening, but see \fIfseek\fP(3f) ! 348: and \fIioinit\fP(3f) for alternatives. ! 349: Existing files are never truncated on opening. ! 350: Sequentially accessed external files are truncated to the current file ! 351: position on \fBclose\fP, \fBbackspace\fP, or \fBrewind\fP only if the last ! 352: access to the file was a write. ! 353: An ! 354: .B endfile ! 355: always causes such files to be truncated to the current ! 356: file position. ! 357: .Nh 2 "Format interpretation" ! 358: Formats which are in format statements are parsed by the compiler; ! 359: formats in \fBread\fP, \fBwrite\fP, and \fBprint\fP statements ! 360: are parsed during execution by the ! 361: .Sm I/O ! 362: library. ! 363: Upper as well as lower case characters are recognized in format statements ! 364: and all the alphabetic arguments to the I/O library routines. ! 365: .PP ! 366: If the external representation of a datum ! 367: is too large for the field width specified, the specified ! 368: field is filled with asterisks (\(**). ! 369: On \fBE\fPw.d\fBE\fPe output, ! 370: the exponent field will be filled with asterisks if the ! 371: exponent representation is too large. ! 372: This will only happen if ``e'' is zero (see appendix B). ! 373: .PP ! 374: On output, a real value that is truly zero will display as ``0.'' to ! 375: distinguish it from a very small non-zero value. ! 376: If this causes problems for other input systems, the ! 377: \fBBZ\fP edit descriptor may be used to cause the field ! 378: following the decimal point to be filled with zero's. ! 379: .PP ! 380: Non-destructive tabbing is implemented for both internal and external ! 381: formatted I/O. ! 382: Tabbing left or right on output ! 383: does not affect previously written portions of a record. ! 384: Tabbing right on output ! 385: causes unwritten portions of a record to be filled with blanks. ! 386: Tabbing right off the end of an input logical record is an error. ! 387: Tabbing left beyond the beginning of an input logical record leaves ! 388: the input pointer at the beginning of the record. ! 389: The format specifier ! 390: .B T ! 391: must be followed by a positive non-zero number. ! 392: If it is not, it will have a different meaning (see \(sc\|3.1). ! 393: .PP ! 394: Tabbing left requires seek ability on the logical unit. ! 395: Therefore it is not allowed in I/O to a terminal or pipe. ! 396: Likewise, nondestructive tabbing in either direction is possible ! 397: only on a unit that can seek. Otherwise tabbing right or spacing with ! 398: .B X ! 399: will write blanks on the output. ! 400: .Nh 2 "List directed output" ! 401: In formatting list directed output, the I/O system tries to prevent ! 402: output lines longer than 80 characters. ! 403: Each external datum will be separated by two spaces. ! 404: List directed output of ! 405: .B complex ! 406: values includes an appropriate comma. ! 407: List directed output distinguishes between ! 408: .B real ! 409: and ! 410: .B "double precision" ! 411: values and formats them differently. ! 412: Output of a character string that includes ``\\n'' ! 413: is interpreted reasonably by the output system. ! 414: .Nh 2 "I/O errors" ! 415: If I/O errors are not trapped by the user's program an appropriate ! 416: error message will be written to ``stderr'' before aborting. ! 417: An error number will be printed in ``[ ]'' along with a brief error message ! 418: showing the logical unit and I/O state. ! 419: Error numbers < 100 refer to ! 420: .UX ! 421: errors, and are described in the ! 422: introduction to chapter 2 of the ! 423: .UX ! 424: Programmer's Manual. ! 425: Error numbers \(>= 100 come from the I/O library, and are described ! 426: further in the appendix to this writeup\(dd. ! 427: .FS ! 428: \(dd On many systems, these are also available in \fIhelp f77 io_err_msgs\fP. ! 429: .FE ! 430: For internal I/O, part of the string will be printed with ``|'' at the ! 431: current position in the string. ! 432: For external I/O, part of the current record will be displayed if ! 433: the error was caused during reading from a file that can backspace. ! 434: .sp 1 ! 435: .Nh 1 "Non-``ANSI Standard'' extensions" ! 436: Several extensions have been added to the I/O system to provide ! 437: for functions omitted or poorly defined in the standard. ! 438: Programmers should be aware that these are non-portable. ! 439: .Nh 2 "Format specifiers" ! 440: .B B ! 441: is an acceptable edit control specifier. It causes return to the logical unit's ! 442: default mode of blank interpretation. ! 443: This is consistent with ! 444: .B S ! 445: which returns to default sign control. ! 446: .PP ! 447: .B P ! 448: by itself is equivalent to ! 449: .B 0P ! 450: \&. It resets the scale factor to the ! 451: default value, 0. ! 452: .PP ! 453: The form of the \fBE\fPw.d\fBE\fPe format specifier has been extended to ! 454: .B D ! 455: also. ! 456: The form \fBE\fPw.d.e is allowed but is not standard. ! 457: The ``e'' field specifies the minimum number of digits or spaces in the ! 458: exponent field on output. ! 459: If the value of the exponent is too large, the exponent notation ! 460: .B e ! 461: or ! 462: .B d ! 463: will be dropped from the output to allow one ! 464: more character position. ! 465: If this is still not adequate, the ``e'' field will be filled with ! 466: asterisks (\(**). ! 467: The default value for ``e'' is 2. ! 468: .PP ! 469: An additional form of tab control specification has been added. ! 470: The ! 471: .Sm ANSI ! 472: standard forms \fBTR\fPn, \fBTL\fPn, and \fBT\fPn are supported ! 473: where ! 474: .I n ! 475: is a positive non-zero number. ! 476: If ! 477: .B T ! 478: or n\fBT\fP is specified, tabbing will ! 479: be to the next (or n-th) 8-column tab stop. ! 480: Thus columns of alphanumerics can be lined up without counting. ! 481: .PP ! 482: A format control specifier has been added to suppress the newline ! 483: at the end of the last record of a formatted sequential write. The ! 484: specifier is a dollar sign ($). It is constrained by the same rules ! 485: as the colon (:). It is used typically for console prompts. ! 486: For example: ! 487: ! 488: .DS ! 489: write (\(**, "(\(fmenter value for x: \(fm,$)") ! 490: read (\(**,\(**) x ! 491: .DE ! 492: .PP ! 493: Radices other than 10 can be specified for formatted integer I/O ! 494: conversion. The specifier is patterned after ! 495: .B P, ! 496: the scale factor for ! 497: floating point conversion. It remains in effect until another radix is ! 498: specified or format interpretation is complete. The specifier is defined ! 499: as [n]\fBR\fP where 2 \(<= \fIn\fP \(<= 36. If ! 500: .I n ! 501: is omitted, ! 502: the default decimal radix is restored. ! 503: .PP ! 504: The format specifier \fBO\fPm.n may be used for an octal conversion; ! 505: it is equivalent to 8\fBR,I\fPm.n,10\fBR\fP. ! 506: Similarly, \fBZ\fPm.n is equivalent to 16\fBR,I\fPm.n,10\fBR\fP and ! 507: may be used for an hexadecimal conversion; ! 508: .PP ! 509: In conjunction with the above, a sign control specifier has been added ! 510: to cause integer values to be interpreted as unsigned during output ! 511: conversion. The specifier is ! 512: .B SU ! 513: and remains in effect until another ! 514: sign control specifier is encountered, or format interpretation is ! 515: complete.\(dg ! 516: .FS ! 517: \(dgNote: Unsigned integer values greater than (2\(**\(**31 - 1), ! 518: can be read and written using \fBSU\fP. ! 519: However they can not be used in ! 520: computations because ! 521: .Fo ! 522: uses signed arithmetic and such values appear to the arithmetic unit ! 523: as negative numbers. ! 524: .FE ! 525: Radix and ``unsigned'' specifiers could be used to format ! 526: a hexadecimal dump, as follows: ! 527: ! 528: .DS ! 529: 2000 format ( SU, 8Z10.8 ) ! 530: .DE ! 531: ! 532: .Nh 2 "Print files" ! 533: The ! 534: .Sm ANSI ! 535: standard is ambiguous regarding the definition of a ``print'' file. ! 536: Since ! 537: .UX ! 538: has no default ``print'' file, an additional ! 539: .B form= ! 540: specifier ! 541: is now recognized in the ! 542: .B open ! 543: statement. ! 544: Specifying ! 545: .B "form = \(fmprint\(fm" ! 546: implies ! 547: .B formatted ! 548: and enables vertical format ! 549: control for that logical unit (see \(sc\|2.3). ! 550: Vertical format control is interpreted only on sequential formatted writes ! 551: to a ``print'' file. ! 552: .PP ! 553: The ! 554: .B inquire ! 555: statement will return ! 556: .B print ! 557: in the ! 558: .B form= ! 559: string variable ! 560: for logical units opened as ``print'' files. ! 561: It will return -1 for the unit number of an unconnected file. ! 562: .PP ! 563: If a logical unit is already open, an ! 564: .B open ! 565: statement including the ! 566: .B form= ! 567: option or the ! 568: .B blank= ! 569: option will do nothing but re-define those options. ! 570: This instance of the ! 571: .B open ! 572: statement need not include the file name, and ! 573: must not include a file name if ! 574: .B unit= ! 575: refers to a standard input or output. ! 576: Therefore, to re-define the standard output as a ``print'' file, use: ! 577: ! 578: .DS ! 579: open (unit=6, form=\(fmprint\(fm) ! 580: .DE ! 581: .Nh 2 "Scratch files" ! 582: A ! 583: .B close ! 584: statement with ! 585: .B "status = \(fmkeep\(fm" ! 586: may be specified for temporary files. ! 587: This is the default for all other files. ! 588: Remember to get the scratch file's real name, ! 589: using ! 590: .B inquire ! 591: \&, if you want to re-open it later. ! 592: .Nh 2 "List directed I/O" ! 593: List directed read has been modified to allow ! 594: tab characters wherever blanks are allowed. ! 595: It also allows input of a string not enclosed in quotes. ! 596: The string must not start with a digit or quote, ! 597: and can not contain any separators ( ``,'', ``/'', blank or tab ). ! 598: A newline will terminate the string unless escaped with \\. ! 599: Any string not meeting the above restrictions ! 600: must be enclosed in quotes (`` " '' or `` \(fm ''). ! 601: .PP ! 602: Internal list directed I/O has been implemented. During internal list reads, ! 603: bytes are consumed until the iolist is satisfied, or the ``end-of-file'' ! 604: is reached. ! 605: During internal list writes, records are filled until the iolist is satisfied. ! 606: The length of an internal array element should be at least 20 bytes to ! 607: avoid logical record overflow when writing double precision values. ! 608: Internal list read was implemented to make command line decoding easier. ! 609: Internal list write should be avoided. ! 610: .Nh 2 "Namelist I/O" ! 611: Namelist I/O is a common extension in Fortran systems. ! 612: The \fBf77\fP version was designed to be compatible with other ! 613: vendors versions; ! 614: it is described in ``A Portable Fortran 77 Compiler'', ! 615: by Feldman and Weinberger, August, 1985. ! 616: .sp 1 ! 617: .Nh 1 "Running older programs" ! 618: Traditional ! 619: .Fo ! 620: environments usually assume carriage control on all logical units, ! 621: usually interpret blank spaces on input as ``0''s, and often provide ! 622: attachment of global file names to logical units at run time. ! 623: There are several routines in the I/O library to provide these functions. ! 624: .Nh 2 "Traditional unit control parameters" ! 625: If a program reads and writes only units 5 and 6, then including ! 626: .B \-lI66 ! 627: in the f77 command will cause carriage control to be interpreted on ! 628: output and cause blanks to be zeros on input without further ! 629: modification of the program. ! 630: If this is not adequate, ! 631: the routine \fIioinit\fP(3f) can be called to specify control parameters ! 632: separately, including whether files should be positioned at their ! 633: beginning or end upon opening. ! 634: .Nh 2 "Ioinit()" ! 635: \fIIoinit\fP(3f) can be used to attach logical units ! 636: to specific files at run time, and to set global parameters for the ! 637: .Sm I/O ! 638: system. ! 639: It will look for names of a user specified form in the environment ! 640: and open the corresponding logical unit for ! 641: .B "sequential formatted" ! 642: I/O. Names must be of the form \fB\s-1PREFIX\s0\fP\fInn\fP where ! 643: .B \\s-1PREFIX\\s0 ! 644: is specified in the call to ! 645: .I ioinit ! 646: and ! 647: .I nn ! 648: is the logical unit to be opened. Unit numbers < 10 must include ! 649: the leading ``0''. ! 650: .PP ! 651: .I Ioinit ! 652: should prove adequate for most programs as written. ! 653: However, it ! 654: is written in ! 655: .Fo \-77 ! 656: specifically so that it may serve as an example for similar ! 657: user-supplied routines. ! 658: A copy may be retrieved by ``ar x /usr/lib/libU77.a ioinit.f''. ! 659: See \(sc\|2.4 for another way to override program file names ! 660: through environment variables. ! 661: .sp 1 ! 662: .Nh 1 "Magnetic tape I/O" ! 663: Because the I/O library uses stdio buffering, reading or writing ! 664: magnetic tapes should be done with great caution, or avoided if possible. ! 665: A set of routines has been provided to read and write arbitrary sized buffers ! 666: to or from tape directly. The buffer must be a ! 667: .B character ! 668: object. ! 669: .B Internal ! 670: I/O can be used to fill or interpret the buffer. ! 671: These routines do not use normal ! 672: .Fo ! 673: I/O processing and do not obey ! 674: .Fo ! 675: I/O rules. ! 676: See \fItopen\fP(3f). ! 677: .sp 1 ! 678: .Nh 1 "Caveat Programmer" ! 679: The I/O library is extremely complex yet we believe there are few bugs left. ! 680: We've tried to make the system as correct as possible according to ! 681: the ! 682: .Sm ANSI ! 683: X3.9\-1978 document and keep it compatible with the ! 684: .UX ! 685: file system. ! 686: Exceptions to the standard are noted in appendix B. ! 687: .bp ! 688: .DS C ! 689: .B "Appendix A" ! 690: ! 691: .B "I/O Library Error Messages" ! 692: .DE ! 693: .XS ! 694: Appendix A: I/O Library Error Messages ! 695: .XE ! 696: .sp 1 ! 697: .PP ! 698: The following error messages are generated by the I/O library. ! 699: The error numbers are returned in the \fBiostat=\fP variable. ! 700: Error numbers < 100 are generated by the ! 701: .UX ! 702: kernel. ! 703: See the introduction to chapter 2 of the ! 704: .UX ! 705: Programmers Manual for their description. ! 706: .nr PD 0 ! 707: .de Er ! 708: .ne 4v ! 709: .IP \\$1 ! 710: \fI\\$2\fP ! 711: .br ! 712: .. ! 713: .RS ! 714: ! 715: .Er 100 "error in format" ! 716: See error message output for the location ! 717: of the error in the format. Can be caused ! 718: by more than 10 levels of nested parentheses, or ! 719: an extremely long format statement. ! 720: ! 721: .Er 101 "illegal unit number" ! 722: It is illegal to close logical unit 0. ! 723: Unit numbers must be between 0 and 99 inclusive. ! 724: ! 725: .Er 102 "formatted i/o not allowed" ! 726: The logical unit was opened for ! 727: unformatted I/O. ! 728: ! 729: .Er 103 "unformatted i/o not allowed" ! 730: The logical unit was opened for ! 731: formatted I/O. ! 732: ! 733: .Er 104 "direct i/o not allowed" ! 734: The logical unit was opened for sequential ! 735: access, or the logical record length was ! 736: specified as 0. ! 737: ! 738: .Er 105 "sequential i/o not allowed" ! 739: The logical unit was opened for direct ! 740: access I/O. ! 741: ! 742: .Er 106 "can't backspace file" ! 743: The file associated with the logical unit ! 744: can't seek. May be a device or a pipe. ! 745: ! 746: .Er 107 "off beginning of record" ! 747: The format specified a left tab beyond the ! 748: beginning of an internal input record. ! 749: ! 750: .Er 108 "can't stat file" ! 751: The system can't return status information ! 752: about the file. Perhaps the directory is ! 753: unreadable. ! 754: ! 755: .Er 109 "no \(** after repeat count" ! 756: Repeat counts in list directed I/O must be ! 757: followed by an \(** with no blank spaces. ! 758: ! 759: .Er 110 "off end of record" ! 760: A formatted write tried to go beyond the ! 761: logical end-of-record. An unformatted read ! 762: or write will also cause this. ! 763: ! 764: .Er 111 "truncation failed" ! 765: The truncation of an external sequential file on ! 766: .B close , ! 767: .B backspace , ! 768: .B rewind , ! 769: or ! 770: .B endfile ! 771: failed. ! 772: ! 773: .Er 112 "incomprehensible list input" ! 774: List input has to be just right. ! 775: ! 776: .Er 113 "out of free space" ! 777: The library dynamically creates buffers for ! 778: internal use. You ran out of memory for this. ! 779: Your program is too big! ! 780: ! 781: .Er 114 "unit not connected" ! 782: The logical unit was not open. ! 783: ! 784: .Er 115 "invalid data for integer format term" ! 785: Only spaces, a leading sign and digits are allowed. ! 786: ! 787: .Er 116 "invalid data for logical format term" ! 788: Legal input consists of spaces (optional), a period (optional), and then ! 789: a ``t'', ``T'', ``f'', or ``F''. ! 790: ! 791: .Er 117 "\|\(fmnew\|\(fm file exists" ! 792: You tried to open an existing file with ! 793: ``status=\|\(fmnew\|\(fm''. ! 794: ! 795: .Er 118 "can't find \|\(fmold\|\(fm file" ! 796: You tried to open a non-existent file ! 797: with ``status=\|\(fmold\|\(fm''. ! 798: ! 799: .Er 119 "opening too many files or unknown system error" ! 800: Either you are trying to open too many files ! 801: simultaneously or there has been an undetected system error. ! 802: ! 803: .Er 120 "requires seek ability" ! 804: Direct access requires seek ability. ! 805: Sequential unformatted I/O requires seek ! 806: ability on the file due to the special ! 807: data structure required. Tabbing left ! 808: also requires seek ability. ! 809: ! 810: .Er 121 "illegal argument" ! 811: Certain arguments to ! 812: .B open , ! 813: etc. will be ! 814: checked for legitimacy. Often only non-default ! 815: forms are looked for. ! 816: ! 817: .Er 122 "negative repeat count" ! 818: The repeat count for list directed input ! 819: must be a positive integer. ! 820: ! 821: .Er 123 "illegal operation for unit" ! 822: An operation was requested for a device ! 823: associated with the logical unit which ! 824: was not possible. This error is returned ! 825: by the tape I/O routines if attempting to ! 826: read past end-of-tape, etc. ! 827: ! 828: .Er 124 "invalid data for d, e, f or g format term" ! 829: Input data must be legal. ! 830: ! 831: .Er 125 "illegal input for namelist" ! 832: Column one of input is ignored, the namelist name ! 833: must match, the variables must be in the namelist, ! 834: and the data must be of the right type. ! 835: .if n .nr PD 1v ! 836: .if t .nr PD 0.3v ! 837: .RE ! 838: .bp ! 839: .LP ! 840: .DS C ! 841: .B "Appendix B" ! 842: ! 843: .B "Exceptions to the ANSI Standard" ! 844: .DE ! 845: .XS ! 846: Appendix B: Exceptions to the ANSI Standard ! 847: .XE ! 848: .sp 1 ! 849: .PP ! 850: A few exceptions to the ! 851: .Sm ANSI ! 852: standard remain. ! 853: .sp 1 ! 854: .LP ! 855: .B "Vertical format control" ! 856: .PP ! 857: The ``+'' carriage control specifier is not fully implemented ! 858: (see \(sc\|2.3). ! 859: It would be difficult to implement it correctly and still ! 860: provide ! 861: .UX -like ! 862: file I/O. ! 863: .PP ! 864: Furthermore, the carriage control implementation is asymmetrical. ! 865: A file written with carriage control interpretation can not be ! 866: read again with the same characters in column 1. ! 867: .PP ! 868: An alternative to interpreting carriage control internally is to ! 869: run the output file through a ``Fortran output filter'' ! 870: before printing. This filter could recognize a much broader range ! 871: of carriage control and include terminal dependent processing. ! 872: One such filter is \fIfpr\fP(1). ! 873: .sp 1 ! 874: .LP ! 875: .B "Default files" ! 876: .PP ! 877: Files created by default use of ! 878: .B endfile ! 879: statements are opened for ! 880: .B "sequential formatted" ! 881: access. There is no way to redefine such a file to allow ! 882: .B direct ! 883: or ! 884: .B unformatted ! 885: access. ! 886: .sp 1 ! 887: .LP ! 888: .B "Lower case strings" ! 889: .PP ! 890: It is not clear if the ! 891: .Sm ANSI ! 892: standard requires internally generated strings to be upper case or not. ! 893: As currently written, the ! 894: .B inquire ! 895: statement will return lower case strings for any alphanumeric data. ! 896: .sp 1 ! 897: .LP ! 898: .B "Exponent representation on Ew.dEe output" ! 899: .PP ! 900: If the field width for the exponent is too small, the standard ! 901: allows dropping the exponent character but only if the exponent ! 902: is > 99. This system does not enforce that restriction. ! 903: Further, the standard implies that the entire field, ``w'', should be ! 904: filled with asterisks if the exponent can not be displayed. ! 905: This system fills only the exponent field in the above case since ! 906: that is more diagnostic. ! 907: .sp 1 ! 908: .LP ! 909: .B "Pre-connection of files" ! 910: .PP ! 911: The standard says units must be pre-connected to files before the program ! 912: starts or must be explicitly opened. ! 913: Instead, the I/O library ! 914: connects the unit to a file on its first use in a ! 915: \fBread\fP, \fBwrite\fP, \fBprint\fP, or \fBendfile\fP statement. ! 916: Thus \fBinquire\fP by unit can not tell prior to a unit number use the ! 917: characteristics or name of the file corresponding to a unit. ! 918: .\" want Table of Contents to begin on page 2 hence must expand body ! 919: .\" of .TC macro to enable us to get handle on page number. ! 920: .pn 2 ! 921: .bp ! 922: .PX
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.