C 计算目录中文件的函数

C 计算目录中文件的函数,c,C,我写了一个代码来计算一些东西。由于我有很多文件,我试图重写代码,它可以从一个文件夹中读取一个文件,计算一些函数,并在另一个文件夹中给出一个输出。我找到了一些我能做到这一点的例子,但有些地方出了问题。作为输出,我没有收到每个文件(例如,我在一个文件夹中有5个输入文件,但我只收到4个带有结果的文件)。我做错了什么?以下是我的主要代码部分: int main() { int my_size = 100; char katalogIn[512]; strcpy(katalogIn, "input");

我写了一个代码来计算一些东西。由于我有很多文件,我试图重写代码,它可以从一个文件夹中读取一个文件,计算一些函数,并在另一个文件夹中给出一个输出。我找到了一些我能做到这一点的例子,但有些地方出了问题。作为输出,我没有收到每个文件(例如,我在一个文件夹中有5个输入文件,但我只收到4个带有结果的文件)。我做错了什么?以下是我的主要代码部分:

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);
}
intmain()
{
int my_size=100;
char katalogIn[512];
strcpy(katalogIn,“输入”);
char katalogOut[512];
strcpy(katalogOut,“输出”);
DIR*dp;
结构方向*条目;
结构stat statbuf;
if((dp=opendir(katalogIn))==NULL){
fprintf(stderr,“无法打开目录:%s\n”,katalogIn);
返回1;
}
int fileCounter=0;
字符文件名[512];
while((entry=readdir(dp))!=NULL){
lstat(输入->数据单位名称和状态单位);
fileCounter++;
if(S_ISDIR(statbuf.st_模式)){
//printf(“完成”);
}否则{
如果(文件名!=NULL)
{
文件*fileData1;
strcpy(文件名,katalogIn);
strcat(文件名“/”;
strcat(文件名、条目->数据单元名称);
fileData1=fopen(文件名,“r”);
if(fileData1==NULL){
printf(“无法打开文件\n”);
返回-1;
}
charbuffer[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));
如果(x!=NULL&&y!=NULL&&z!=NULL)
{
int i;
fseek(fileData1,0,0);
对于(i=0;i数据单元名称);
//strcat(文件名为“out”);
fileOutput1=fopen(文件名,“w”);
if(fileOutput1==NULL){
printf(“无法打开文件\n”);
返回-1;
}
对于(i=0;i
readdir
循环中,“条目”(
entry->d_name
)的名称是它所在目录的相对名称。因此,如果您有一个文件
/input/foo
,那么
entry->d_name
将仅为
“foo”

你真的应该检查返回的内容。我打赌它是
-1
,设置为
enoint
(这意味着
statbuf
未初始化,所有成员将具有不确定的值)

要使
lstat
不失败,您需要进入目录,或者应该有一个临时字符串,用于连接目录和文件名。稍后在代码中执行的操作(尽管我建议使用
snprintf
而不是三个字符串函数调用)


还有一些看起来很奇怪的问题。例如,
fileName
是一个数组,这意味着它永远不会为
NULL


也请阅读。这并不是说您需要动态分配,因为在编译时您有一个固定的大小,这意味着您可以在
readdir
循环中为
x
y
z
使用数组,所以“条目”(entry->d_name)的名称是它所在目录的相对名称。因此,如果您有一个文件
/input/foo
,那么
entry->d_name
将仅为
“foo”

你真的应该检查返回的内容。我打赌它是
-1
,设置为
enoint
(这意味着
statbuf
未初始化,所有成员将具有不确定的值)

要使
lstat
不失败,您需要进入目录,或者应该有一个临时字符串,用于连接目录和文件名。稍后在代码中执行的操作(尽管我建议使用
snprintf
而不是三个字符串函数调用)


还有一些看起来很奇怪的问题。例如,
fileName
是一个数组,这意味着它永远不会为
NULL


也请阅读。这并不是说您需要动态分配,因为在编译时您有一个固定的大小,这意味着您可以使用数组来进行
x
y
z

我想我不明白如何更正我的代码。添加一行chdir(katalogIn)后;出现错误“无法打开文件”。关于我的代码中奇怪的事情:我自己在学习C,所以我知道很多事情可以用更好的方式来完成,但是在一个文件上它工作正常。@raquela,那是因为你在代码后面使用了整个“附加目录和文件名”的东西。既然这样做了,就不要执行
chdir
,而是在调用
lstat
之前将“追加目录和文件名”移到。比如
snprintf(文件名,sizeof(文件名),%s/%s”,katalogIn,entry->d_name);int res=lstat(文件名)。我想我不明白如何更正我的代码。添加一行chdir(katalogIn)后;出现错误“无法打开文件”。关于我的代码中奇怪的事情:我自己在学习C,所以我知道很多事情可以用更好的方式来完成,但是在一个文件上它工作正常。@raquela,那是因为你在代码后面使用了整个“附加目录和文件名”的东西。既然你这么做了,