-1

私はこの防御プログラミングの問題を抱えていますが、解決方法がよくわかりません。

ファイルパスとテーブルのサイズ(行/列数)を引数として取るこの関数があり、入力ファイルを検証するためのより良い方法を探しています。この関数の引数は常に正しいと思います。sizeファイルに保存されているテーブルの「小さい側」を表します。

例えば ​​:

1 2 3 4 
5 6 7 8 

サイズ=2は正しいですが

1 2 3 4 5
5 6 7 8 9

サイズ=2は正しくありません

このようなファイルも拒否できるようにしたいと思います

1 2 3 4 5 6 7 8

サイズ=2(fscanfを介して受け入れられます)

拒否できるようにしたい別の種類のファイルは

1 2 3
4 5 6

サイズ=2

今のところ、私の唯一のセキュリティは、ファイルの要素が本当に数字であるかどうかをチェックすることです。

これが私がこれまでに行ったコードです:

void import(float** table, int size, char* path)
{
    FILE* data = fopen(path, "r");
    assert(data);
    int i,j;
    int st;

    for (i=0; i<size; i++)
    {
        for(j=0; j<(size*2)-1; j++)
        {
            st = fscanf(data, "%f", &table[i][j]);
            if (!st)
            {
                printf("Error while importing the file.\n");
                fclose(data);
                return -1;
            }
        }
    }
    fclose(data);
}

私はどこからどのように始めればよいのかわかりません。Cに精通しておらず、やりたいことを実行するための関数やメカニズムがたくさんあるようですが、それらはすべて非常に複雑に見え、実際にはコードよりも長いものもあります。提供された。

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです。

4

3 に答える 3

1

forループは次のようになります。

char line[1000], *token;
for (i = 0; i < size; i++) // for each line
{
    if (fgets(line, 1000, data) != NULL) // read line
    {
        token = strtok (line," ");
        for (j = 0; j < (size * 2) - 1; j++) // for each number from line
        {
            if (sscanf(token, "%f", &table[i][j]) <= 0)
            {
                // there are columns missing:
                printf("Error while importing the file.\n");
                fclose(data);
                return -1;
            }
            token = strtok (NULL," ");
        }
    }
    else
    {
        // there are rows missing:
        printf("Error while importing the file.\n");
        fclose(data);
        return -1;
    }
}

またassert(data);、次のようなものに置き換える必要があることに注意してください。

if (!data)
{
    printf("Error while openning the file [filePath=\"%s\"].\n", filePath);
    cleanExit();
}
于 2012-02-20T21:38:19.843 に答える
1

の行の終わりを簡単に検出することはできないscanf()ため、それを直接使用しても基準を満たせません。

おそらく、行全体(fgets()またはおそらくgetline())を読み取ってから、各行を順番に処理する必要があります。行処理ではsscanf()、を使用でき、%nディレクティブも使用できます。要約すると、これは要約すると次のようになります。

for (line_num = 0; line_num < size; line_num++)
{
    ...read line from file into buffer line, checking for EOF...
    start = line;
    for (i = 0; i < 2 * size; i++)
    {
        if (sscanf(start, "%f%n", &value, &offset) != 1)
            ...ooops - short line or non-numeric data...
        else
        {
            start += offset;
            table[line_num][i] = value;
        }
    }
}
...check that there's no clutter after the last expected line...
于 2012-02-20T21:21:06.333 に答える
0

ファイル全体のチェックサムを計算することもできます。問題は、あなたがそれについてどれほど真剣であるかということです。xorチェックサムを作成するのは簡単ですが、衝突に対しては実際には安全ではありません。重要な場合は、おそらくsha-1のようなものを使用するのが最善です。

于 2012-02-20T21:36:22.010 に答える