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