ページ 11

fopen_s関数について

Posted: 2011年1月28日(金) 20:11
by YYSS
C++で、fopen関数を使うと警告が出てしまいます・・・
warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

コード:

    char fname[32]	= {"stage\\Stage1.csv"};
   	//ファイル読み込み
	fp	= fopen( fname, "r" );
	if( fp == NULL ){
            printfDx("read error\n");
            return;
    }
#pragma warning ( disable : 4996 )
で警告を消すことは出来たのですが、調べたところ「fopen_s」という関数を使うのが良いとのことなので
http://msdn.microsoft.com/ja-jp/library ... 80%29.aspx

コード:

 
   char fname[32]	= {"stage\\Stage1.csv"};
   	//ファイル読み込み
    if( fopen_s( &fp, fname, "r" ) == NULL ){
            printfDx("read error\n");
            return;
    }
とやると、今度は読み取ることが出来なくなってしまいました。

ゲーム製作程度なら、fopenを使って警告を消しても問題ないのでしょうか?

Re: fopen_s関数について

Posted: 2011年1月28日(金) 20:24
by h2so5
fopen_s および _wfopen_s で開かれたファイルは共有できません。ファイルを共有する必要がある場合には、適切な共有モード定数 (たとえば、読み取り/書き込み共有の場合は _SH_DENYNO) で _fsopen、_wfsopen を使用します。
とMSDNには書かれているので、_fsopen()を試してみたらどうでしょうか。

Re: fopen_s関数について

Posted: 2011年1月28日(金) 21:01
by softya(ソフト屋)
fopen_sとか_fsopenの類は、マイクロソフト独自の非標準関数です。
少し安全性が上がる代わりにC言語としては非標準となりますので、bccやgccでコンパイルできなくなります。
マイクロソフトの余計なおせっかいなので無視しても構いません。

過去ログ参考。
http://dixq.net/forum/viewtopic.php?t=6019&p=51296

Re: fopen_s関数について

Posted: 2011年1月29日(土) 00:49
by YYSS
標準じゃない関数を使うのは気が引けるので結局、
fopenを使用して、毎回Warningが出るのも嫌なので・・・

#pragma warning(disable:4996)

で解決?しました。

標準関数で警告を出すのは止めて欲しいです;;
解決するのに無駄に時間がかかってしまいます;;

Re: fopen_s関数について

Posted: 2011年1月29日(土) 23:18
by ISLe
fopen_sの戻り値はエラーコードなので正常終了で0が返ります。
NULLはC++で0と定義されています。

#bccやgccが非標準をデフォにしてるところがあっても非難されないのは黙ってこっそりやってるからですかね。