C
VisualStudio

fopen_sをfopenの代わりに使うときのやりかた

コードの見本

以下のコードはfopen_sでファイルを読み込み(read)モードで開きそれを画面に出力するというプログラムです。

#include<stdio.h>

int main(void)
{
  int a;
  FILE  *fp;
  errno_t error;

  error = fopen_s(&fp,"tukauyatu.txt","r");

  if(error != 0)
        printf("ファイルを開けませんでした");
  else{
        while((a = fgetc(fp)) != EOF)
               putchar(a);
        putchar('\n');
        fclose(fp);
      }

  return 0;
 }

fopenとfopen_sの使い方の違い

使い方の違いとして注目すべき点は、開いたファイルのアドレスをどうやって渡しているのかという事ではないでしょうか。
fopenでは

fp = fopen("tukauyatu.txt","r");

となるように、開いたファイルのアドレスを、戻り値としてファイル型のポインタ変数に渡しますが
fopen_sでは

error = fopen_s(&fp,"tukauyatu.txt","r");

となり、戻り値ではなく、第一引数にファイル型のポインタ変数のアドレスを指定することで、第二引数で指定したファイルを 第三引数で選んだモードで開き、その開いたファイルのアドレスを第一引数で指定したポインタ変数に渡します。

また、fopen_sはファイルを開くのに成功した場合はerrno_t型の0を返してくれるのでそれを強調するために上のコードの見本では

if(error != 0)
   printf("ファイルを開けませんでした");

としていますが、ここは以下のように省略することもできます。

if((fopen_s(&fp, "tukauyatu.txt", "r")) != 0)
   printf("ファイルを開けませんでした");

その他細かなことについて

fopen_sもその名の後ろについている「_s」の印のとおりfopenのセキュリティー強化版です。fopen_sはfopenとは違って排他的モードで開いてくれるらしいのですが、私はまだその恩恵を受けたことがなく、そのことについてはここには書くことができないので、もしそれを利用したい方は申し訳ありませんが、ほかの記事を参照していただけると幸いです。