ページ 11

間接参照のレベルが異なっていてエラーが出ました。。わかる方助けてください!!

Posted: 2018年5月11日(金) 14:14
by Akatsuki
c言語のファイルを開くプログラムを作ってコンパイルしたら、
「C4047: '=': 間接参照のレベルが 'FILE *' と 'errno_t' で異なっています。」とでてエラーが出ました。どうすればエラーがなくなりますか?


#include <stdio.h>
#include <string.h>

main()
{
FILE *fp; // FILE型構造体
char fname[] = "test.dat";
int Index = 0;

/* ファイルのオープン */
fp = fopen_s(&fp, fname, "r");
if (fp == NULL) {
printf("%sファイルを開けません\n", fname);
return 0;
}
else {
printf("%sファイルを開いた!!\n", fname);
}

/* ファイルのクローズ */
if (fclose(fp) != 0) {
perror("ファイルのクローズに失敗しました\n");
}
else {
printf("ファイルを正常にクローズしました\n");
return 0;
}
}


解決方法がわかる方たすけてください。
お願いします。

Re: 間接参照のレベルが異なっていてエラーが出ました。。わかる方助けてください!!

Posted: 2018年5月11日(金) 19:58
by Bull
fopen_s() の返却値は errno_t です。
警告メッセージの通り型が違います。
このままでは、fp を上書きしてしまうのでダメですね。
以下のようにすればいいと思います。

コード:

#include <stdio.h>
#include <string.h>

main()
{
	FILE *fp; // FILE型構造体
	char fname[] = "test.dat";
	int Index = 0;

	/* ファイルのオープン */
	//fp = fopen_s(&fp, fname, "r");
	errno_t err = fopen_s(&fp, fname, "r");			//fopen_s の戻り値は errno_t
	//if (fp == NULL) {
	if (err != 0) {
		printf("%sファイルを開けません - ", fname);
		perror(NULL);								//エラーの理由を stderr に出力
		return 0;
	} else {
		printf("%sファイルを開いた!!\n", fname);
	}

	/* ファイルのクローズ */
	if (fclose(fp) != 0) {
		perror("ファイルのクローズに失敗しました\n");
	} else {
		printf("ファイルを正常にクローズしました\n");
		return 0;
	}
}

Re: 間接参照のレベルが異なっていてエラーが出ました。。わかる方助けてください!!

Posted: 2018年5月14日(月) 10:50
by Akatsuki
解決しました!ありがとうございます。