Discussion:
fflush異常について
(too old to reply)
shuichi
2007-06-05 01:21:01 UTC
Permalink
はじめまして。

ファイル書込みについて質問させてください。
以下の手順でファイル書込みをおこなっているのですが、
かなり低い発生頻度でfflushが失敗することがあります。

fopen(file_name, "w+b");
fwrite();
fflush();
fclose();

fflush()が失敗する要因は何が考えられるのでしょうか?

それと、fopenに"c" (コミットフラグ有効)を追加しようと思っています。
これは有効な手段なのでしょうか?
fopen(file_name, "w+bc");

また、ファイル書込みが失敗した場合などは、
みなさんどのような対処をされておられるのでしょうか?
(リトライなどは有効なのでしょうか)

以上、よろしくお願いいたします。
IIJIMA Hiromitsu
2007-06-05 23:22:02 UTC
Permalink
$B$$$$$8$^$G$9!#(B
$B0J2<$N<j=g$G%U%!%$%k=q9~$_$r$*$3$J$C$F$$$k$N$G$9$,!"(B
fopen(file_name, "w+b");
fwrite();
fflush();
fclose();
fflush()$B$,<:GT$9$kMW0x$O2?$,9M$($i$l$k$N$G$7$g$&$+!)(B
errno $B$H$+!"(BVisual C $B$J$i(B GetLastError() $B$H$+!"%A%'%C%/$7$^$7$?$+!)(B
$B$=$l$H!"(Bfopen$B$K(B"c" $B!J%3%_%C%H%U%i%0M-8z!K$rDI2C$7$h$&$H;W$C$F$$$^$9!#(B
$B$3$l$OM-8z$J<jCJ$J$N$G$7$g$&$+!)(B
fopen(file_name, "w+bc");
$B$4$a$s$J$5$$!"$3$l$O$o$+$s$J$$!D(B
$B!t$=$b$=$bI8=`(B ISO C $B$K(B c $B%*%W%7%g%s$C$F$"$j$^$7$?$C$1!)(B
$B$^$?!"%U%!%$%k=q9~$_$,<:GT$7$?>l9g$J$I$O!"(B
$B$_$J$5$s$I$N$h$&$JBP=h$r$5$l$F$*$i$l$k$N$G$7$g$&$+!)(B
$B!J%j%H%i%$$J$I$OM-8z$J$N$G$7$g$&$+!K(B
$B;d$O(BC$B$G=q$+$J$/$J$C$F5W$7$$$G$9$,!":G6a$O$b$C$Q$i%N!<%A%'%C%/!J<:GT$7$F$b(B
$B$=$N$^$^B39T!K$G$9!#$h$/$F%(%i!<EG$$$F=*N;$+$J!#(B

========================================================================
$BHSEh(B $***@8w(B / $B$G$k$b$s$?!&$$$$$8$^(B mailto:***@csc.jp
(Mr.) IIJIMA, Hiromitsu http://www.dennougedougakkai-ndd.org/~delmonta/
shuichi
2007-06-11 22:21:00 UTC
Permalink
回答ありがとうございました。

コミットフラグは、Microsoft固有のものでANSI標準ではありません。

低水準での書込みをするべきというのも読んでいましたが、
それでは、そもそも fopenなどは使えないものなのか?
という疑問でした。

fflush()の異常が発生した場合は、連続して書き込めなくなり
復旧できないので、困っていました。

GetLastErrorで発生した時の状態をチェックしたいと思います。

ありがとうございました。
いいじまです。
Post by shuichi
以下の手順でファイル書込みをおこなっているのですが、
かなり低い発生頻度でfflushが失敗することがあります。
fopen(file_name, "w+b");
fwrite();
fflush();
fclose();
fflush()が失敗する要因は何が考えられるのでしょうか?
errno とか、Visual C なら GetLastError() とか、チェックしましたか?
Post by shuichi
それと、fopenに"c" (コミットフラグ有効)を追加しようと思っています。
これは有効な手段なのでしょうか?
fopen(file_name, "w+bc");
ごめんなさい、これはわかんない…
#そもそも標準 ISO C に c オプションってありましたっけ?
Post by shuichi
また、ファイル書込みが失敗した場合などは、
みなさんどのような対処をされておられるのでしょうか?
(リトライなどは有効なのでしょうか)
私はCで書かなくなって久しいですが、最近はもっぱらノーチェック(失敗しても
そのまま続行)です。よくてエラー吐いて終了かな。
========================================================================
(Mr.) IIJIMA, Hiromitsu http://www.dennougedougakkai-ndd.org/~delmonta/
tamatama
2007-06-06 12:32:18 UTC
Permalink
Post by shuichi
fflush()が失敗する要因は何が考えられるのでしょうか?
マニュアルを見ていると指定されているストリームのバッファがない場合となっているようです。
setvbuf関数でバッファリングをオフにするか、低水準の_open、_writeで書くべきとなっています。
Continue reading on narkive:
Loading...