質問: UnityのC#側でダウンロードしてきたデータをネイティブに保存するライブラリを作っています。 ファイルのオープン・クローズのタイムラグを減らしたいので、 iOS・Androidアプリ起動時はファイルをオープンしたまま閉じないようにしています。 ダウンロードファイルの実体はあるファイルに追加書き込みとなるため、 ``` fopen(実体用ファイルパス,"a+b"); ``` 実体ファイルをハッシュ・位置・サイズを用いて管理するファイルは Map形式なので全体書き込みとなるため、 ``` fopen(実体管理用ファイルパス,"w"); ``` としています。 上記、実体用ファイルはfwriteのたびにファイルの中身が更新されるのですが、 実体管理用ファイルはfwriteだけでは更新されず fcloseしないとファイルの中身が更新されません。 **■質問** ●ファイルの先頭から末端までをオープンしたまま 書き込む場合、どのようにすれば良いでしょうか? (ファイルが巨大になっても良いようにできる限りfcloseを最小限にしたいです。) ●また、fwriteの内部の細かい仕様が記載されたページなどあれば 教えていただけませんか? (どのモードの時は、ファイルにかかれるのか?メモリ上にしか持っていないのか?)
回答: 書き出してほしいタイミングで`fflush()`を呼ぶか、`setvbuf()`でバッファリングモードを指定してください。特に`_IONBF`を指定してバッファリングせずに常に書き出すよう設定することもできます。 `fwrite()`はバッファリングモードに従って書き込むだけです。 毎回同じ場所に書き込むのであれば一度しか書き込みができずバッファの意味がありません。"w"は開いた直後の状態を指定するだけで、永続的に状態が変化しないことを保証するものではありません。 `ftell()`、`fseek()`、`rewind()`、`feof()`、`ferror()`など基本的なストリーム処理について理解すべきです。