大変申し訳ないのですが、まだまだ初心者で課題が解けません。
もしお時間の方良ければ、下の問題について解説、またはプログラムを記載して下されば助かります。
無理を言ってすみません。よろしくお願いします。
課題は、「プログラム言語C 第2版 ANSI規格準拠:B.W.カーニハン/D.M.リッチー著(共立出版)」の
p144の演習5-12で、
-------------------------------------------
入力の最後のn行を印字するプログラムtailを書け。
nの省略時の仮定値は10であるが、これは省略可能な引数によって変更できるようにし、
tail -n
で最後のn行を印字するようにせよ。
入力やnの値が誤っていてもプログラムはちゃんと動作するようにせよ。
記憶領域の使用が最良になるように、すなわち行は、固定サイズの二次元配列ではなく、ポインタ配列(ポインタへのポインタ)で格納するようにプログラムを書け。
-------------------------------------------
です。
これは「コマンド行の引数」という節にあります。
解説不足かも知れませんが、よろしくお願いします。
Cプログラムの課題です(>_<)
Re:Cプログラムの課題です(>_<)
今手元に「プログラム言語C 第2版」がないのではっきりしたことはいえませんが、書かれた内容だけだと要件が不明確ですね。
nの範囲をどう考えるかで設計が変わってきます。また、処理系にもある程度依存します。
もう少し具体的に書くと、「プログラム言語C 第2版」はいわゆるC89の解説書です。C89では、オブジェクトのサイズとして保証されるのが32767バイトまでですので、それをポインタのサイズで割った行数までしか、この問題でいうところの「ポインタ配列」では扱えません。
nの範囲をどう考えるかで設計が変わってきます。また、処理系にもある程度依存します。
もう少し具体的に書くと、「プログラム言語C 第2版」はいわゆるC89の解説書です。C89では、オブジェクトのサイズとして保証されるのが32767バイトまでですので、それをポインタのサイズで割った行数までしか、この問題でいうところの「ポインタ配列」では扱えません。
Re:Cプログラムの課題です(>_<)
内容不十分ですみません。
UNIXで使えるtailコマンドを実際にプログラムする問題だと私は思っています。
サイズと言いますか、行数の範囲は1000行までとなっているようです。
UNIXで使えるtailコマンドを実際にプログラムする問題だと私は思っています。
サイズと言いますか、行数の範囲は1000行までとなっているようです。
Re:Cプログラムの課題です(>_<)
> UNIXで使えるtailコマンドを実際にプログラムする問題だと私は思っています。
はい。それは分かります。
> 行数の範囲は1000行までとなっているようです。
なるほど。だとすると、ほかに問題になりそうなのは、1行あたりの文字数の制限だけですね。
1行辺りの文字数の制限をなくすには、テンポラリファイルを使うしかありません。
ただし、テンポラリファイルを使う場合、最低限扱えるサイズは何も保証されなくなります。
入力が標準入力ではなく、(シーク可能な)ファイルに制限できるなら、ftellの返却値またはfpos_tの配列にすることで、上記の問題は回避できます。
しかし、その場合には、
> ポインタ配列(ポインタへのポインタ)で格納するようにプログラムを書け。
の条件を満たせなくなります。
はい。それは分かります。
> 行数の範囲は1000行までとなっているようです。
なるほど。だとすると、ほかに問題になりそうなのは、1行あたりの文字数の制限だけですね。
1行辺りの文字数の制限をなくすには、テンポラリファイルを使うしかありません。
ただし、テンポラリファイルを使う場合、最低限扱えるサイズは何も保証されなくなります。
入力が標準入力ではなく、(シーク可能な)ファイルに制限できるなら、ftellの返却値またはfpos_tの配列にすることで、上記の問題は回避できます。
しかし、その場合には、
> ポインタ配列(ポインタへのポインタ)で格納するようにプログラムを書け。
の条件を満たせなくなります。
Re:Cプログラムの課題です(>_<)
なるほど。1行あたりの文字数の制限もいるのですね。
自分の中では、ファイルの最後のn行を印字したいと思っています。
この場合も、文字数の制限などいるのでしょうか?
自分の中では、ファイルの最後のn行を印字したいと思っています。
この場合も、文字数の制限などいるのでしょうか?