47
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-06

#コードの見本
以下のコードは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とは違って排他的モードで開いてくれるらしいのですが、私はまだその恩恵を受けたことがなく、そのことについてはここには書くことができないので、もしそれを利用したい方は申し訳ありませんが、ほかの記事を参照していただけると幸いです。

47
36
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?