ファイルの読込み(ソースコード説明)

赤字でコメントを入れています。参考にして下さい。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineはほかの利用方法によって格納する数字を変更する可能性があるときに使用します。 ソースコードの最初においておき変更したいときにサクッと変更します。今回は今後変更する ことはないでしょうが行数、列数、中に入れる数字を設定できるようにしています。 マスは9×9で入れる数字は1〜9までの9つです。

#define ROW 10
#define COL 10
#define N 10
int main(int argc, char* argv[]) {
    int i, j, n, row, col, cnt = 0;
    int item[ROW][COL][N], conf_item[ROW][COL];
    char gomi[100];
    FILE  *Input_File, *Output_File;
配列数は決まっているのでfor文によって初期化しておきます。 配列を準備しても何も入れておらず参照するとエラーになります。 最初のうちに初期化しておきます。

    /*Step1 初期化*/
    for (row = 0; row < ROW; row++) {
        for (col = 0; col < COL; col++) {
            conf_item[row][col] = 0;/*初期は未定*/
            for (n = 0; n < N; n++) {
                item[row][col][n] = 1;/*初期はすべての数字に可能性がある*/
            }
        }
    }
 
    /*---File準備---*/
    /*in*/
    if (fopen_s(&Input_File, argv[1], "r")) {
        printf("FILE OPEN FAILURE!!\n");
    }
    /*out*/
    if (fopen_s(&Output_File, "out.txt", "w")) {
        printf("FILE OPEN FAILURE!!\n");
    }
    printf("-----%s-----\n", argv[1]);
    /*---File準備終わり---*/
	
fscanf_sでファイルに書かれている数字を一行ずつ読み込んでいきます。 今回は9文字と決まっているので%dを9つ準備して読み込んでいきます。 この読み方をしたらせっかくdefineで行列数を決めているのに9×9にしか対応しませんが書くのが簡単なので今回はこのようにしておきます。

    /*---Step2 File読み込み---*/
    for (row = 1; row < ROW; row++) {
        /*conf_itemに入力データを入れ込む*/
        fscanf_s(Input_File, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 
				&conf_item[row][1], &conf_item[row][2], &conf_item[row][3],
				&conf_item[row][4], &conf_item[row][5], &conf_item[row][6],
				&conf_item[row][7], &conf_item[row][8], &conf_item[row][9]);
    }
    /*itemに入力データを入れ込む。確定しているマスには該当する数字のitemに1、それ以外のitemに0を入れる。*/
    printf_s("Input_File\n");
    fprintf_s(Output_File, "Input_File\n");
    for (row = 1; row < ROW; row++) {
        for (col = 1; col < COL; col++) {
	
conf_itemに0以外の数字が入っていたら(row,col)に数字が入っているということにしているので他の数字は入らない。 そのため入る可能性があるか判定用に準備しているitemには0を入れます。

            if (conf_item[row][col] != 0) {
                for (n = 0; n < N; n++) {
                    item[row][col][n] = 0;
                }
                item[row][col][conf_item[row][col]] = 1;
            }
            printf_s("%d,", conf_item[row][col]);
            fprintf_s(Output_File, "%d,", conf_item[row][col]);/*出力ファイルに入力データを出力*/
        }
        printf_s("\n");
        fprintf_s(Output_File, "\n");
    }
    /*---item入力完了---*/
    fclose(Input_File);
    /*---File読み込み終わり---*/
    fclose(Input_File);
    fclose(Output_File);
    /*--コマンドライン停止用、意味はない--*/
    scanf_s("%s", gomi, 100);
}
※fscanf、printf、fprintfなどは visual studioではfscanf_s、printf_s、fprintf_sとしないとエラーとなります。

<<0.考え方      >>1.ファイルの準備     >>2.判定式の作成