- ベストアンサー
質問ですが・・
今メモリに領域を確保してからfgetcで1文字ずつ読み込みfputcで1文字ずつ書き込むプログラムがあるのですが、あるところから一気に書き込むことはできないでしょうか。 例で言うと 1.100文字読み込むとする 2.20文字まではfputcで1文字ずつ書き込み残り(80文字)は一気に書き込む この方法がわからずに困っています。もしよろしかったらご教授願います
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ファイルサイズを知りたいのであれば、過去に同じ質問があります。fseekでファイルの終わりに移動してftellで場所を聞くわけです。そのあと、念のためfseekでファイル先頭に移動しておいた方がいいかもしれません。 http://okweb.jp/kotaeru.php3?q=969132 単純に20文字読みたいだけなら、メモリを準備しておいて char buf[256]; fread(buf, sizeof(char), 20, fp); で返ってきた値が実際にbufに書き込まれた数です。20が返ってくるはずですが、途中でファイルの終わりになったりすると20より小さい値になります。
その他の回答 (5)
- ency
- ベストアンサー率39% (93/238)
> 一応さらっと調べたところないような感じです。 そうでしたか…。 ファイルサイズの先読みして、ファイルを一気に読込む方法としては、たとえば次のような感じでできると思います。 1. fseek() で ファイルサイズのフィールド先頭に移動。 2. ファイルサイズのフィールドを読み込む。 3. rewind() でファイル先頭に移動。 4. 先読みしたファイルサイズ分だけ、fread() する。 …でも、使えなさそうなんですよね。。。 # たとえば、ビットレートや再生時間等から、ファイルサイズを # 計算したりできないのかなぁ。。。 # …って、ちょっとしつこかったですね。 # 失礼しました。 一度 EOF をサーチしたらファイルサイズがわかるから、そのサイズ分だけ一気に読み込む…ってことは、結局 No4 rot-N さんと同じ方法になってしまいますね。
- ency
- ベストアンサー率39% (93/238)
MPEG って、ヘッダとかにファイルサイズのフィールドを持っていないのでしょうか? # MPEG のファイルフォーマットをよく知らないで言っていること # ですので、見当違いだったら無視して下さい。 もし、ファイルサイズのフィールドを持っているのであれば、それを先読みしておいてそのサイズ分だけ fread() で読み込めば良いんじゃないかな、って思ったんですけど、いかがなものでしょうか?
- rot-N
- ベストアンサー率27% (118/432)
fseek、ftellっていう関数もあります。 全部を一度読んでしまって、ファイルのバイト数を確定すれば良いでしょう。
- Bonjin
- ベストアンサー率43% (418/971)
>fwriteとfreadで読み込む文字数が決まっていなくてもできるのでしょうか。 の意味がよくわかりませんが、freadとfwriteは指定したサイズのバイトを読み書きします。 百聞より一見です。試してみるのが一番いいでしょう。 freadとfwriteについては下記のサイトがわかりやすかったです。
- Bonjin
- ベストアンサー率43% (418/971)
fread関数とfwrite関数を使えば実現できるのではないでしょうか?
補足
さっそくの返答ありがとうございます。fwriteとfreadで読み込む文字数が決まっていなくてもできるのでしょうか。具体的にいうと動画ファイル(MPEG)を読み込んでいます。動画のサイズがまちまちなので読み込む数を決めなくても使えるものでしょうか。
補足
返答ありがとうございます。とにかく最初からfgetcで読み込むようにしています。一応さらっと調べたところないような感じです。もしあったとしてもファイルサイズのフィールドを先読みする方法がわからないです(TT)。