12184


UnityのC#側でダウンロードしてきたデータをネイティブに保存するライブラリを作っています。

ファイルのオープン・クローズのタイムラグを減らしたいので、  
iOS・Androidアプリ起動時はファイルをオープンしたまま閉じないようにしています。

ダウンロードファイルの実体はあるファイルに追加書き込みとなるため、

[code]

    fopen(実体用ファイルパス,"a+b");
    
[/code]

実体ファイルをハッシュ・位置・サイズを用いて管理するファイルは  
Map形式なので全体書き込みとなるため、

[code]

    fopen(実体管理用ファイルパス,"w");
    
[/code]

としています。

上記、実体用ファイルはfwriteのたびにファイルの中身が更新されるのですが、  
実体管理用ファイルはfwriteだけでは更新されず  
fcloseしないとファイルの中身が更新されません。

**■質問**  
●ファイルの先頭から末端までをオープンしたまま  
書き込む場合、どのようにすれば良いでしょうか？  
（ファイルが巨大になっても良いようにできる限りfcloseを最小限にしたいです。）

●また、fwriteの内部の細かい仕様が記載されたページなどあれば  
教えていただけませんか？  
(どのモードの時は、ファイルにかかれるのか？メモリ上にしか持っていないのか？)


CC BY-SA 3.0
2015-07-09T03:10:16.933
12182
2015-07-09T07:16:53.657
2015-07-09T03:59:05.243
5261
5261
question
c
fopenのモードによるfwriteの挙動の違いについて


書き出してほしいタイミングで`fflush()`を呼ぶか、`setvbuf()`でバッファリングモードを指定してください。特に`_IONBF`を指定してバッファリングせずに常に書き出すよう設定することもできます。

`fwrite()`はバッファリングモードに従って書き込むだけです。

* * *

毎回同じ場所に書き込むのであれば一度しか書き込みができずバッファの意味がありません。"w"は開いた直後の状態を指定するだけで、永続的に状態が変化しないことを保証するものではありません。  
`ftell()`、`fseek()`、`rewind()`、`feof()`、`ferror()`など基本的なストリーム処理について理解すべきです。


CC BY-SA 3.0
2015-07-09T03:50:14.913
12184
2015-07-09T07:16:53.657
2015-07-09T07:16:53.657
4236
4236
12182
answer