Some Memorandum

DirectX11に挑む素人の備忘録。

fopenとfopen_s

ある方に頂いたCのテキスト『やさしいC』を進めてます。

で、その中にこんなコードがありました。

#include<stdio.h>

int main(void)
{
	FILE *fp;

	fp = fopen("test1.txt", "w");

	if (fp == NULL)
	{
		printf("ファイルをオープンできませんでした。\n");
		return 1;
	}
	else
	{
		printf("ファイルをオープンしました。\n");
	}

	fclose(fp);
	printf("ファイルをクローズしました。\n");

	return 0;
}

ただファイルを開いて閉じるだけのコードなんだけど_s様がいらっしゃる前の本なんで、このコードは今は動かないです。(脆弱性なんか知るかという場合はごにょごにょやって動かすこともできます。)

fopenは危ないからfopen_sを使ったパターンがこれです。

#include<stdio.h>

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

	error = fopen_s(&fp, "test1.txt", "w");

	if (error != 0)
	{
		printf("ファイルをオープンできませんでした。\n");
		return 1;
	}
	else
	{
		printf("ファイルをオープンしました。\n");
	}

	fclose(fp);
	printf("ファイルをクローズしました。\n");

	return 0;
}

ちょっとめんどくさくなってます。
fopenのときは

  • 引数

(ファイル名,オープンモード)

  • 戻り値

FILE*型(ファイルを指し示すポインタ)
エラーの際はNULL

でした。

fopen_sでは

  • 引数

(ファイルポインタ,ファイル名,オープンモード)

  • 戻り値

errno_t型
エラーの際は非ゼロの値

になってます。
なんで、
errno_t error;

error = fopen_s(&fp, "test1.txt", "w");

if (error != 0)
ここらへんがちょっと変わることになりました。

結構_sに対応してないコードを見かけます。特に入門系。
テキスト通りにやればできるっつたのにできねえのはおかしいよなぁ!とかキレてはいけない(戒め)