FORTRAN(標準入力、文字列トリム)

FORTRAN続きで、標準入力です。
標準入力を使うには、READ(*,*)でよさそうです。標準入力した文字列を表示するプログラムを作ります。
100文字ぐらい読めるようにCHARACTER*100で定義しておきます。

takk@deb9:~$ cat stdin.f
      PROGRAM stdin
      CHARACTER*100 LINE

      READ(*,*,end=99999) LINE
      WRITE(*,*) LINE
99999 STOP
      END
takk@deb9:~$ gfortran stdin.f
takk@deb9:~$ echo HELLO| ./a.out
 HELLO                                                                          
takk@deb9:~$

複数行読めるでしょうか。

takk@deb9:~$ seq 10 | ./a.out
 1                                                                              

takk@deb9:~$

良く分かってないですが、やはり先頭の一行しか無理そうです。
複数行読むには、DOで回します。

takk@deb9:~$ cat stdin2.f
      PROGRAM stdin2
      CHARACTER*100 LINE

      DO
        READ(*,*,end=99999) LINE
        WRITE(*,*) LINE
      END DO
99999 STOP
      END
takk@deb9:~$ gfortran stdin2.f
takk@deb9:~$ seq 10 | ./a.out
 1                                                                              

 2                                                                              

 3                                                                              

 4                                                                              

 5                                                                              

 6                                                                              

 7                                                                              

 8                                                                              

 9                                                                              

 10                                                                             

takk@deb9:~$

出るには出たのですが、なぜ一つ飛びで表示されるのでしょう。
もしかして、*100となっているのが原因かも。端末の行数を超えてしまってるのかもしれません。
wcコマンドで確認してみます。

takk@deb9:~$ seq 10 | ./a.out | wc -L
101
takk@deb9:~$

間違いないです。改行を含めて101文字表示されています。
トリムしてみます。
文字列変数(最初,最後)で部分文字列が抽出できるので、文字列の長さが分かればいけるでしょうか。LENを使ってみます。

takk@deb9:~$ cat stdin3.f
      PROGRAM stdin3
      CHARACTER*100 LINE

      DO
        READ(*,*,end=99999) LINE
        WRITE(*,*) LEN(LINE)
      END DO
99999 STOP
      END
takk@deb9:~$ gfortran stdin3.f
takk@deb9:~$ seq 10 | ./a.out
         100
         100
         100
         100
         100
         100
         100
         100
         100
         100
takk@deb9:~$

だめでした。空白も含んだ文字列の長さが出てしまうので100と表示されます。当然でしたね。
次は、INDEXで空白の出現位置を取得してみます。

takk@deb9:~$ cat stdin4.f
      PROGRAM stdin4
      CHARACTER*100 LINE

      DO
        READ(*,*,end=99999) LINE
        WRITE(*,*) INDEX(LINE,' ')
      END DO
99999 STOP
      END
takk@deb9:~$ gfortran stdin4.f
takk@deb9:~$ seq 10 | ./a.out
           2
           2
           2
           2
           2
           2
           2
           2
           2
           3
takk@deb9:~$

大丈夫そうです。INDEXで空白の出現位置を確認して、トリムしたいと思います。

takk@deb9:~$ cat stdin5.f
      PROGRAM stdin5
      CHARACTER*100 LINE

      DO
        READ(*,*,end=99999) LINE
        WRITE(*,*) LINE(1:INDEX(LINE,' '))
      END DO
99999 STOP
      END
takk@deb9:~$
takk@deb9:~$ gfortran stdin5.f
takk@deb9:~$ seq 10 | ./a.out
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10

できました。念のためカラム数を確認します。

takk@deb9:~$ seq 10 | ./a.out | wc -L
4

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA