2017-06-19 7 views
0

何かを計算するコードを書きました。私は多くのファイルを持っているので、コードを書き直そうとしています。フォルダからファイルを読み込み、関数を計算し、別のフォルダに出力します。私はそれを作ることができるいくつかの例を見つけましたが、何かが間違っています。出力として、私はすべてのファイルを受け取っていませんでした(例:フォルダに5つの入力ファイルがありますが、結果は4つしかありません)。私が間違っていることは何ですか?ここでは、コードの私の主要な部分である:あなたのreaddirループではディレクトリのファイルの計算機能

int main() 
{ 
int my_size = 100; 
char katalogIn[512]; 
strcpy(katalogIn, "input"); 
char katalogOut[512]; 
strcpy(katalogOut, "output"); 

DIR *dp; 
struct dirent *entry; 
struct stat statbuf; 
if ((dp = opendir(katalogIn)) == NULL) { 
    fprintf(stderr, "Cannot open directory: %s\n", katalogIn); 
    return 1; 
} 

int fileCounter = 0; 
char fileName[512]; 

    while ((entry = readdir(dp)) != NULL) { 
     lstat(entry->d_name, &statbuf); 
     fileCounter++; 
     if (S_ISDIR(statbuf.st_mode)) { 
    //printf("Done"); 
     } else { 

    if (fileName != NULL) 
    { 
     FILE *fileData1; 
      strcpy(fileName, katalogIn); 
      strcat(fileName, "/"); 
      strcat(fileName, entry->d_name); 
      fileData1 = fopen(fileName, "r"); 
      if (fileData1 == NULL) { 
       printf("Cannot open the file\n"); 
       return -1; 
      } 

      char buffor[512]; 
    float *x = (float*)malloc(my_size * sizeof(float)); 
    float *y = (float*)malloc(my_size * sizeof(float)); 
    float *z = (float*)malloc(my_size * sizeof(float)); 
    if (x != NULL && y != NULL && z != NULL) 
    { 
     int i; 
     fseek(fileData1, 0, 0); 
     for (i = 0; i < my_size; i++) 
     { 
      if (fscanf(fileData1, "%f\t%f\t%f", x + i, y + i, z +i) != 3) 

      { 
       break; 
      } 
     } 
     fclose(fileData1); 

     FILE *fileOutput1; 
      strcpy(fileName, katalogOut); 
      strcat(fileName, "/"); 
      strcat(fileName, entry->d_name); 
      //strcat(fileName,"out"); 
      fileOutput1 = fopen(fileName, "w"); 
      if (fileOutput1 == NULL) { 
       printf("Cannot open the file\n"); 
       return -1; 
      } 

     for (i = 0; i < my_size; i++) 
     { 
      float convX, convY; 
      int successCode = my_func(x[i], y[i], &convX, &convY); 
      fprintf(fileOutput1,"%.2f\t%.2f\t%.2f\n", convX, convY,z[i]); 

     } 
     free(x); 
     free(y); 
     free(z); 
     fclose(fileOutput1); 
    } 
     } 

    }} 

closedir(dp); 
return (EXIT_SUCCESS); 
} 

答えて

2

、「エントリ」(entry->d_name)の名​​前が、それは中のディレクトリへ相対名でファイルを持っているので、もし/input/fooentry->d_name"foo"になります。

lstatは、が返されます。私は-1errnoENOENTに設定しています(つまり、statbufは初期化されていないことを意味し、すべてのメンバーは不確定の値を持つ)。

lstatに失敗しないようにするには、ディレクトリにchdirが必要です。または、ディレクトリとファイル名を連結する一時的な文字列が必要です。後でコードで行うことがあります(3つの文字列関数呼び出しの代わりにsnprintfを使用することをお勧めします)。


奇妙に見える他のいくつかの問題もあります。例えばfileNameは、それがNULLになることはありません意味配列、です。

またthis discussion about casting the result of mallocをお読みください。ではないあなたは、あなたがxyzのための配列を使用できることを意味、コンパイル時に固定サイズを持っているので、動的に割り当てる必要があること。

+0

私のコードを修正する方法がわかりません。行chdir(katalogIn)を追加した後。 「ファイルを開くことができません」というエラーが表示されます。私のコードでは奇妙なことについて:私は自分でCを学んでいるので、もっと良い方法で多くのことができることがわかっていますが、1つのファイル上で正しく動作していました。 – raquela

+0

@raquelaこれは、コードの*後の*が「ディレクトリとファイル名の追加」全体を使用するためです。あなたはそれを行うので、 'chdir'を実行せず、代わりに' lstat'の呼び出しの前に「ディレクトリとファイル名の追加」を移動します。 'snprintf(fileName、sizeof(fileName)、"%s /%s "、katalogIn、entry-> d_name)と同様です。 int res = lstat(fileName); ... '。 –