C言語関係掲示板

過去ログ

No634 ファイルの最後から読み込む

[戻る] [ホームページ]
No.6712

ファイルの最後から読み込む
投稿者---khukhu(2003/05/24 22:05:03)


単語の書かれたファイルを逆に読み込み
標準出力へ出力したいんですが
どういうふうに考えればよいのでしょうか?

読み込むテキストファイル:
apple orange peach
出力結果:
hcaep egnaro elppa

読み込んでから逆にするのではなく
読み込む段階で逆にしたいのですが。

No.6719

Re:ファイルの最後から読み込む
投稿者---ともじ(2003/05/25 00:18:20)


こんばんは。

>単語の書かれたファイルを逆に読み込み
>標準出力へ出力したいんですが

>読み込んでから逆にするのではなく
>読み込む段階で逆にしたいのですが。

何故、読み込む段階で逆にしたいのでしょうか。

ファイル入出力関数は、ファイルの先頭から順に読み書きするシーケン
シャルアクセスに都合のよいように作られており、ファイル入出力動作後
にファイル位置指示子を進めます。ですから、逆に読み込むというのは、
その流れに逆らうことになり、効率がよくありません。効率がよくない
ばかりか、テキストファイルの場合には、ファイルの読み込み位置を随時
変更するランダムアクセスはするべきではありません。
素直に先頭から読むことをお勧めします。


No.6720

Re:ファイルの最後から読み込む
投稿者---khukhu(2003/05/25 00:26:08)


>ファイル入出力関数は、ファイルの先頭から順に読み書きするシーケン
>シャルアクセスに都合のよいように作られており、ファイル入出力動作後
>にファイル位置指示子を進めます。ですから、逆に読み込むというのは、
>その流れに逆らうことになり、効率がよくありません。効率がよくない
>ばかりか、テキストファイルの場合には、ファイルの読み込み位置を随時
>変更するランダムアクセスはするべきではありません。
>素直に先頭から読むことをお勧めします。

すみません、おっしゃったことは理解できたのですが
そういう課題がでているんです。
どうすればファイルの最後から読み込めるか教えて
いただけませんか?お願いします。

No.6721

Re:ファイルの最後から読み込む
投稿者---こん!(2003/05/25 05:09:56)


>そういう課題がでているんです。

何故そういう課題が出るのか不思議ですがその辺の経緯は教えていただくわけに
はいかないのですね。普通に考えると課題というのはそこまで習った技術を応用
例題によって理解度を判断するといった狙いがあるとは思うのですがあまりいい
課題とはいえませんね。出来ない事はありませんが。

こちらを参考にされて
1.ファイルの終端までファイルポインタを飛ばしまず1バイトポインタを戻す。
2.1バイト読み込み文字列を生成し2バイトファイルポインタを戻す。
3.ファイルシークが失敗したら最後の文字列を出力し終了。
4.文字がスペースなら生成文字列を出力し文字列バッファをリセットする。2.へ

てな感じの流れでプログラムを組めば目的は達成されるかな。
あまり意味無いけど・・・

No.6722

Re:ファイルの最後から読み込む
投稿者---shelly(2003/05/25 09:05:29)


>4.文字がスペースなら生成文字列を出力し文字列バッファをリセットする。

これ必要?
ただ単に読む→出力→ファイルポインタ移動の繰り返しでいいんじゃなくて?


No.6735

Re:ファイルの最後から読み込む
投稿者---こん!(2003/05/25 14:59:35)


>これ必要?
>ただ単に読む→出力→ファイルポインタ移動の繰り返しでいいんじゃなくて?

お〜ごめん。まるまる逆転だったのね。ちゃんと読んでなかったわ。
各文字列はそのままだと早とちりしてた。m(__)m

いつもいつも不備な解答の添削をありがとうございます。

こん!<=^・^=>


No.6754

Re:ファイルの最後から読み込む
投稿者---khukhu(2003/05/25 23:11:26)


説明ありがとうございます。
まだできていませんがやってみます。
課題の経緯ではないですが、追記すると
この問題は3番目の問題でその前に
1番、標準入力、標準出力、EOFとは何か。
2番、UNIXで標準入出力の入力元、出力先を変更するにはどうすればよいか。
という問題があります。


No.6747

Re:ファイルの最後から読み込む
投稿者---ともじ(2003/05/25 21:07:18)


>すみません、おっしゃったことは理解できたのですが
>そういう課題がでているんです。

そうですか。そういう課題が出ているのですか。

実は、規格では、fseekでテキストファイルを任意の位置に移動する
ことは認めていないのです。
「int fseek(FILE *stream, long int offset, int whence);
テキストストリームの場合、offsetが0であるか、又はoffset
が同じストリームに対する以前のftell関数の呼出しで返された
値でなければならない。後者の場合、whenceはSEEK_SETでなければ
ならない。」

ですから、No.6719では、「テキストファイルの場合には、ファイルの
読み込み位置を随時変更するランダムアクセスはするべきではありません。」
のように書きました。確かに、やってみればできるとは思うのですが、
やるべきでないことには違いないのです。

ファイルioはとても奥が深く、処理系によりかなり動作が異なります。
私も、テキストファイルでfseekを随時使えないということは最近
知りました。ですから、おそらく、この課題をだされた先生も
ご存じないのではと思われます。

上の投稿のようにすれば逆からの入力は可能ですが、やるべきではない、
ということは押さえておいてください。

なお、fseekのページにも上記は追記しておきます。

No.6768

Re:ファイルの最後から読み込む
投稿者---khukhu(2003/05/26 02:03:37)


無事完成しました。
みなさんありがとうございました。