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


コメント