自分用メモ

まだいろいろと再構成中。

タグ: C

こういう構造体を作ってfscanf_sを使おうとする。
struct phone_type{
   char name[40];
   int areacode;
   char number[9];
} phone[MAX];

正解はこのように、
fscanf_s(fp, "%s%d%s", phone[loc].name, _countof(phone[loc].name), &phone[loc].areacode, phone[loc].number, _countof(phone[loc].number));

%s フォーマットの変数に対する要素数指定には_countof()を使ったりするけれど、
%d フォーマットの変数(&になる)に対する要素数指定は「なし」が正解。

fscanfを使おうとすると、「fscanf_sを使え」と怒られる件。

例えばグローバルでこういうの宣言して、

char names[100][40];
char numbers[100][40];


こういうのを作った時、

void load(void){
FILE *fp;
errno_t errno;

if ((errno = fopen_s(&fp, "phone", "r")) != 0){
printf("ファイルを開けない\n");
printf("%d", errno);
exit(1);
}

loc = 0;
while (!feof(fp)){
printf("%s%s", names[loc], numbers[loc]);
fscanf_s(fp, "%s%s", names[loc], 40, numbers[loc], 40);
loc++;
}
fclose(fp);
}


fscanf_sのパラメータで、各変数の後にその大きさ(赤字で書いたもの)を入れないと、コンパイルは通るが実行時エラーで落ちる。

*** fscanf_s だけでなく、gets_s / strcpy_s(これはコンパイルも通らない)も同様。

if ((from=fopen(argv[1], "r")) == NULL)
みたいな文が書いてあるCの本の例題をVisual Studio 2013に入れてみると、「fopenは使うな、fopen_sを使え」みたいなふうに怒られる。さらに、argc, argv[]が出てくると、どうしたものか迷う。

1. argc, argv[]=コマンドライン引数の入れ方
コマンドライン引数指定
みたいに、プロジェクトのプロパティのデバッグのコマンド引数に入れる。

で、実行してみてもエラーになる。結局、デバッグモードでのコマンドライン引数指定は.exeファイルと同じ場所ではダメだった。ここに入れなくてはいけない。
argv対象ファイルの場所
consoleappication5の下の、consoleappication5のフォルダで、かつDebugフォルダの上。これを発見するには、一旦fopen_sのパラメータを"w”にして実験してみる必要がある。


2. fopen_s騒動
こことかここに書いてあるけど、初心者がいきなりそれを見てもわからない。

要するに、

int main(int argc, char *argv[])
{
FILE *from, *to;
char ch, watch;
errno_t errno;

/*コマンドライン引数の数確認*/
if (argc < 3){
printf("引数だめだよ\n");
exit(1);
}

/*コピー元ファイルを開く*/
if ((errno = fopen_s(&from, argv[1], "r")) != 0){
printf("コピー元ファイルを開けない\n");
printf("%s\n", argv[1]);
printf("%d", errno);

exit(1);
}

/*コピー先ファイルを開く*/
if ((errno = fopen_s(&to, argv[2], "w")) != 0){
printf("コピー先ファイルを開けない\n");
printf("%s\n", argv[2]);
printf("%d", errno);

exit(1);
}

if (argc == 4 && !strcmp(argv[3], "watch"))
watch = 1;
else
watch = 0;

/*ファイルをコピー*/
while ((ch = fgetc(from)) != EOF){
fputc(ch, to);
if (watch) putchar(ch);
}
fclose(from);
fclose(to);


の青字みたいにすれば動く。赤字みたいなのを加えておくと動作確認できる。

このページのトップヘ