2012-02-20 13 views
-1

私は本当に解決する方法がわからないこの防御プログラミングの問題があります。入力ファイルの内容を確認しています

私は、引数としてファイルのパスとテーブルのサイズを(行/列カウント)かかり、私は、入力ファイルを検証するより良い方法を探しています。この機能を持っています。この関数の引数は常に正しいと仮定します。例えば

sizeは、ファイルに格納されるテーブルの "小側" を表す= 2

1 2 3 4 5 
5 6 7 8 9 

サイズが間違っている間= 2

1 2 3 4 
5 6 7 8 

サイズが正しいこと

また、私はこの

ようなファイルを拒否できるようにしたいのですが
1 2 3 4 5 6 7 8 

サイズ=私は拒否できるようにしたいファイルの別のタイプは、として

1 2 3 
4 5 6 

サイズ= 2

ある

(fscanfを介して受け入れられている)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で本当に堪能じゃないと機能の多くを存在があるようです私が望むことをするための仕組みがありますが、それらはすべて非常に複雑に見えますが、実際に提供されているコードよりも長いものもあります。

誰もが素晴らしいことだろう正しい方向に私を指すことができます。

+0

* "番号= 2" *とは何を意味するのでしょうか? – LihO

+1

正しいファイルがどのようなものか分かりません。私が見ることができるのは、「2」は常に正しいということだけです。 – cnicutar

+0

@LihO入力番号、コード内のサイズ – Sword22

答えて

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(); 
} 
+0

@ Sword22:申し訳ありませんが、私はそこにエラーがありました。この入力を 'line'から直接読み取ることはできません。それをトークンに分割する必要があります。今私の答えをチェックしてください。 – LihO

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... 
0

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

関連する問題