2012-02-21 30 views
2

ファイル名(文字列)を取り、ファイル名(文字列)の配列を持たせて、ファイル名が渡されたかどうかを確認する関数を持っています配列内に追加し、そうでない場合はそれを追加します。ここに私がこれまでに得たものがあります。Cの文字列の配列の文字列をチェックする

bool read_file(char * filename, bool warnings){ 
    //Check to see if filename is in array files 
    static char * files[MAXFILES]; 
    static int counter = 0; 
    for(int i=0;i<counter;i++){ 
    if(strcmp(filename,files[i]) == 0){ 
     fprintf(stdout, "Error\n"); 
     return 0; 
    } 
    else{ 
     files[counter]=filename; 
     counter++; 
    } 
    } 
    FILE * fp = fopen(filename,"r"); 
    if(fp == NULL){ 
    if(warnings){ 
     fprintf(stderr, "Can't open the file %s\n",filename); 
     return 0; 
    } 
    else{ 
     return 0; 
    } 
    } 
    else{ 
    fclose(fp); 
    fp = NULL; 
    return 1; 
    } 
} 

何らかの理由で、ファイル[]にファイル名を追加することはありません。

+0

'for'ループは入力されません。' counter'を '0'に初期化し、' for'ループで 'i Naveen

+0

なぜ 'counter'と' files'は静的でなければなりませんか? – Lundin

答えて

1

はあなたの最初のループ(i == 0counter == 0)を見てみましょう:counterがためのループの本体でインクリメントされているため

static int counter = 0; 
for(int i = 0; i < counter; i++) { 
    // this never runs 
} 

i < counterは、常にfalseです。

ロジックを再考する必要があります。この関数は多くのことをしています。ループの前にあるこのようなものが役立つでしょう:

if (counter == 0) { 
    // first time in the function, just add the filename 
    files[counter]=filename; 
    counter++; 
} 
else { 
    for (int i = 0; i < counter; i++) { 
     ... 
    } 
} 

しかし、これをカップルの機能に分割する方がよいかもしれません。一つは

+0

+1関数を分割する+1関数の最初のコメントが関数の名前と一致しないように見えるときは、おそらくそれを分割するのがよいでしょう:) –

+0

特別なケースの最初の繰り返しはあまり素敵ではありませんそして整った。しかし私は、関数をより小さな部分に分割する提案に同意します。 +1と-1はネットに変更を残さない。 –

+0

@JonathanLeffler - うん、主な問題は、関数のスコープが大きすぎる(これは本当にクラスになりたい)ということです。 D – Seth

0

変更など、それは既に存在だ場合、別のファイルを開くには、第三をチェックするために、配列にファイル名を追加するには、このループのelse句で

for (i=0;i<=counter;i++) 
+0

いいえ。 'for(i = 0; i

1

見えるようにforループ:

for(int i=0;i<counter;i++){ 
    if(strcmp(filename,files[i]) == 0){ 
     fprintf(stdout, "Error\n"); 
     return 0; 
    } 
    else{ 
     files[counter]=filename; 
     counter++; 
    } 
    } 

あなたはそれがリストにない知っている、とあなたはリスト全体を行っていることまでは知らないだろう一度だけリストにファイルを追加したいです。したがって、そのコードは次のようになります。

for (int i = 0; i < counter; i++) 
{ 
    if (strcmp(filename, files[i]) == 0) 
    { 
     fprintf(stdout, "Duplicate file %s found at %d\n", filename, i); 
     return 0; 
    } 
} 
files[counter++] = filename; 

「エラー」よりも優れたエラーメッセージが表示されます。プログラム内でエラーが発生する可能性のある唯一の場所ではないため、何が問題になったのかを知る必要があります。その番号が有用かどうか議論することができます。最も確かに名前がありますが、インデックス番号を持つこともあなたを助けるかもしれません。

1

elseの位置が間違っています。この:

for(int i=0;i<counter;i++){ 
    if(strcmp(filename,files[i]) == 0){ 
     fprintf(stdout, "Error\n"); 
     return 0; 
    } 
    else{ 
     files[counter]=filename; 
     counter++; 
    } 
} 

が入力されていない、そしてそれがためにしたことがないだろう、それは常にあなたが確認を終了する前にそれを追加しているため、ファイルは、リストにあったと思うだろう。あなたはあなたが追加したものを見つけて、それがすでにそこにあったと思います。

代わりに、ファイル名を追加するまで、あなたは全体のリストをチェック終了するまで待つ:

for(int i=0;i<counter;i++){ 
    if(strcmp(filename,files[i]) == 0){ 
    fprintf(stdout, "Error\n"); 
    return 0; 
    } 
} 
files[counter]=filename; 
counter++; 

キーはreturn 0ではなくelse節よりも、あなたの関数のうちの流れをリダイレクトするということです。ループが終了しても、ファイル名がまだ存在しないということは、関数内にある限り、あなたは知っています。