何かを計算するコードを書きました。私は多くのファイルを持っているので、コードを書き直そうとしています。フォルダからファイルを読み込み、関数を計算し、別のフォルダに出力します。私はそれを作ることができるいくつかの例を見つけましたが、何かが間違っています。出力として、私はすべてのファイルを受け取っていませんでした(例:フォルダに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);
}
私のコードを修正する方法がわかりません。行chdir(katalogIn)を追加した後。 「ファイルを開くことができません」というエラーが表示されます。私のコードでは奇妙なことについて:私は自分でCを学んでいるので、もっと良い方法で多くのことができることがわかっていますが、1つのファイル上で正しく動作していました。 – raquela
@raquelaこれは、コードの*後の*が「ディレクトリとファイル名の追加」全体を使用するためです。あなたはそれを行うので、 'chdir'を実行せず、代わりに' lstat'の呼び出しの前に「ディレクトリとファイル名の追加」を移動します。 'snprintf(fileName、sizeof(fileName)、"%s /%s "、katalogIn、entry-> d_name)と同様です。 int res = lstat(fileName); ... '。 –