dポイントプレゼントキャンペーン実施中!

fopen関数について
オープンモードは様々ありますが、既存のファイルをバイナリモードで書き換えるということは出来ないのでしょうか?
オープンモードが、「wb」などの場合は既存のデータを上書きしてしまって、内容が消えてしまいます。
かと言って、「ab」で開くと最後から追加されてしまいます。
fseek関数を使って、場所を指定しても言うことを聞いてくれませんでした。
既存のファイルの途中部分を少し書き換えるだけの作業は、出来ないのでしょうか?

fseek関数について
バイナリモードで開いているときに、ファイルの全体を知りたい時に次のように書いたら間違いなのでしょうか?
fseek(FILE *stream, 0, SEEK_END);
ftell(FILE *stream);
fseekで最後のポジションに移動させて、ftellで最後のカレントポジションを調べるという方法は使えるのでしょうか?

以上2点よろしくお願いします。

A 回答 (4件)

ftell って long int を返すから, 「long int の範囲を超えてしまうような大きさのファイル」だと絶対に不可能

です.
    • good
    • 0

・fopen



ファイル途中の「上書き」のみ可能で、「挿入」も「部分削除」も不可能です。

・fseek

出来る場合出来ない場合があるのは#2で言われている通りですが、ファイルサイズを取るなら普通はfstatかstatを使うのでは。
    • good
    • 0

> バイナリモードで開いているときに、ファイルの全体を知りたい時に次のように書いたら間違いなのでしょうか?


> fseek(FILE *stream, 0, SEEK_END);
> ftell(FILE *stream);

規格上は期待通りの結果が得られることは保証されません。
特定の処理系に限定すれば、うまく動くこともあります(詳しくは処理系のドキュメントを読んでください)。
    • good
    • 0

> fopen関数について


「rb+」(もしくは「r+b」)で開けば、fseekで指定した既存のファイル内容を書き換えができます。

> fseek関数について
可能です。SEEK_ENDで末尾に移動してから、ftell すれば、ファイルサイズが得られます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!