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
コメント