What is the purpose of * in Fortran input/output

后端 未结 2 673
孤街浪徒
孤街浪徒 2020-12-12 05:11

I am learning Fortran because well, yeah, thought I\'d learn it. However, I\'ve found utterly no information on what the purpose of * is in print, read, etc:



        
相关标签:
2条回答
  • 2020-12-12 05:59

    You are correct in that it is a format specifier.

    There's a page on Wikibooks to do with IO and that states:

    The second * specifies the format the user wants the number read with

    when talking about the read statement. This applies to the write and print statements too.

    For fixed point reals: Fw.d; w is the total number of spaces alloted for the number, and d is the number of decimal places.

    And the example they give is

    REAL :: A
    READ(*,'(F5.2)') A
    

    which reads a real number with 2 digits before and after the decimal point. So if you were printing a real number you'd use:

    PRINT '(F5.2)', A
    

    to get the rounded output.

    In your example you're just printing text so there's no special formatting to do. Also if you leave the format specifier as * it will apply the default formatting to reals etc.

    0 讨论(0)
  • 2020-12-12 06:11

    The print statement does formatted output to a special place (which we assume is the screen). There are three available ways to specify the format used in this output. One of these, as in the question, is using *.

    The * format specifier means that the formatted output will be so-called list-directed output. Conversely, for a read statement, it will be list-directed input. Now that the term has been introduced you will be able to find many other questions here: list-directed input/output has many potentially surprising consequences.

    Generally, a format specification item says how to format an item in the input/output list. If we are writing out a real number we'd use a format item which may, say, state the precision of the output or whether it uses scientific notation.

    As in the question, when writing out a character variable we may want to specify the width of the output field (so that there is blank padding, or partial output) or not. We could have

    print '(A20)', "Hello, world!"
    print '(A5)', "Hello, world!"
    print '(A)', "Hello, world!"
    

    which offers a selection of effects. [Using a literal character constant like '(A)' is one of the other ways of giving the format.]

    But we couldn't have

    print '(F12.5)', "Hello, world!"   ! A numeric format for a character variable
    

    as our format doesn't make sense with the output item.

    List-directed output is different from the above cases. Instead, (quote here and later from the Fortran 2008 draft standard) this

    allows data editing according to the type of the list item instead of by a format specification. It also allows data to be free-field, that is, separated by commas (or semicolons) or blanks.

    The main effect, and why list-directed is such a convenience, is that no effort is required on the part of the programmer to craft a suitable format for the things to be sent out.

    When an output list is processed under list-directed output and a real value appears it is as though the programmer gave a suitable format for that value. And the same for other types.

    But the crucial thing here is "a suitable format". The end user doesn't get to say A5 or F12.5. Instead of that latter the compiler gets to choose "reasonable processor-dependent values" for widths, precisions and so on. [Leading to questions like "why so much white space?".] The constraints on the output are given in, for example, Fortran 2008 10.10.4.

    So, in summary * is saying, print out the following things in a reasonable way. I won't complain how you choose to do this, even if you give me output like

     5*0
          1     2
    

    rather than

     0 0 0 0 0 1 2
    

    and I certainly won't complain about having a leading space like

     Hello, world!
    

    rather than

    Hello, world!
    

    For, yes, with list-directed you will (except in cases beyond this answer) get an initial blank on the output:

    Except for new records created by [a special case] or by continuation of delimited character sequences, each output record begins with a blank character.

    0 讨论(0)
提交回复
热议问题