Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
32
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@softnakikaiya

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
32
Help us understand the problem. What are the problem?