fscanf_s ファイル読み込みが理解できません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
masuter

fscanf_s ファイル読み込みが理解できません

#1

投稿記事 by masuter » 2年前

今、下のデータが書き込まれいるファイルを読み込み、データをそのまま表示するというプログラムを作成しております。(------は書き込まれておりません データのみです)
----------------------------------------
北海道 5431 5460 83457
東京都 13300 13230 2104
神奈川県 9079 9067 2416
愛知県 7443 7427 5116
大阪府 8849 8856 1901
福岡県 5090 5085 4847
広島県 2840 2848 8480
鳥取県 578 582 3507
島根県 702 707 6708
岡山県 1930 1936 7010
山口県 1420 1431 6114
----------------------------------------

自分で書いたプログラムが以下になります。

コード:

#include<stdio.h>
#define STRN 256


int main() {
	FILE *fp;
	char s[100];
	int n1, n2, n3;

	fopen_s(&fp, "Prefdata.txt", "r");//読み込み判定
	if (fp == NULL) {
		printf_s("読み込みエラーです。\n");
		return -1;
	}
	while ( fscanf_s(fp, "%s %d %d %d",s ,&n1,&n2,&n3)!= EOF) {
		printf("%s %d %d %d \n",s,n1,n2,n3);
	}
	fclose(fp);
	
	return 0;
}
ネットサイトなども確認したのですが次のような警告が出てきてデバックできません。
どう修正すればいいのでしょうか。

コード:

1>  課題6-2.c
1>c:\users\keisuke\documents\visual studio 2015\projects\課題6-2.c\課題6-2.c(15): warning C4477: 'fscanf_s' : 書式文字列 '%s' には、型 'unsigned int' の引数が必要ですが、可変個引数 2 は型 'int *' です
1>  c:\users\keisuke\documents\visual studio 2015\projects\課題6-2.c\課題6-2.c(15): note: この引数はバッファー サイズとして使用されます
1>c:\users\keisuke\documents\visual studio 2015\projects\課題6-2.c\課題6-2.c(15): warning C4473: 'fscanf_s': 書式文字列として渡された引数が不足しています
1>  c:\users\keisuke\documents\visual studio 2015\projects\課題6-2.c\課題6-2.c(15): note: プレースホルダーとそのパラメーターには 5 の可変個引数が必要ですが、4 が指定されています。
1>  c:\users\keisuke\documents\visual studio 2015\projects\課題6-2.c\課題6-2.c(15): note: 不足している可変個引数 5 が書式文字列 '%d' に必要です
1>  課題6-2.c.vcxproj -> C:\Users\Keisuke\documents\visual studio 2015\Projects\課題6-2.c\Debug\課題6-2.c.exe
1>  課題6-2.c.vcxproj -> C:\Users\Keisuke\documents\visual studio 2015\Projects\課題6-2.c\Debug\課題6-2.c.pdb (Full PDB)

maru
記事: 150
登録日時: 8年前

Re: fscanf_s ファイル読み込みが理解できません

#2

投稿記事 by maru » 2年前

fscanf_sの説明の読み込み不足かと。

https://msdn.microsoft.com/ja-jp/library/6ybhk9kc.aspx からの引用
「セキュリティが強化された関数 (_s サフィックス付き) とその他のバージョンの関数との主な違いは、セキュリティが強化された関数では、c、C、s、S、および [ の各型フィールドを使用するとき、引数として、それぞれの変数の直後にフィールドのサイズを渡す必要がある点です。 詳細については、次を参照してください。 scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_lとscanf 関数の文字幅指定します。」
つまり、引数が一つたりないということ。

返信

“C言語何でも質問掲示板” へ戻る