12

ANSI Cは、ファイルのコンテンツを変更するためにfopen、fwrite、fread、fcloseを定義していることを知っています。ただし、ファイルの切り捨てに関しては、OS固有の機能(truncate()Linux、_chsize_s_()Windowsなど)に目を向ける必要があります。ただし、これらのOS固有の関数を呼び出す前にfileno、非ANSI-C関数を呼び出すことにより、FILEポインターからファイルハンドルを取得する必要があります。

私の質問は次のとおりFILE*です。ファイルを切り捨てた後も使用を継続することは信頼できますか?つまり、ANSI CFILEレイヤーには独自のバッファーがあり、ファイルが下から切り捨てられていることを認識していません。バッファリングされたバイトが切り捨てられたポイントを超えている場合、バッファリングされたコンテンツは実行時にファイルにフラッシュされますfclose()か?

保証がない場合、Windows-Linuxポータブルプログラムを作成するときに、切り捨て操作を伴うファイルI / O関数を使用するためのベストプラクティスは何ですか?

同様の質問:によって返されたファイルハンドルからファイルサイズを照会する場合fileno、後で呼び出すときの正確なサイズですか?fclose()それ以上はありfwrite()ませんか?

[編集2012-12-11]

ジョシュアの提案によると。現在可能なベストプラクティスは次のとおりです。を呼び出してストリームをバッファなしモードに設定し、setbuf(stream, NULL);またはtruncate()ストリーム_chsize_s()を平和的に操作できます。

とにかく、MicrosoftCRTであろうとGNUglibcであろうと、この動作を明示的に確認する公式文書はないようです。

4

2 に答える 2

3

バッファなしのゼロバイトの書き込みは、その時点でファイルを切り捨てることになっているのではないでしょうか。

バッファなしを設定する方法については、この質問を参照してください:ANSICでのバッファなしI/ O

于 2012-12-07T02:41:13.850 に答える