你好,晚上好,
我正在制作一个程序,它将收集给定目录中的所有文件并打印出其中的所有整数。
这是作业,但不是作业。这是我无法弄清楚的一小部分。
以下是代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
#include "mergefiles.c"
int main(int argc, char **argv) {
if(2 != argc)
{
printf("Directory name missing!\n");
return 0;
}
DIR *dp = NULL;
struct dirent *dptr = NULL;
FILE *input_file;
FILE *next_file;
char c;
if (NULL == (dp = opendir(argv[1])))
{
printf("Cannot open the given directory %s", argv[1]);
exit(1);
}
else
{
while(NULL != (dptr = readdir(dp)))
{
if(!strcmp (dptr->d_name, "."))
{
continue;
}
if(!strcmp (dptr->d_name, ".."))
{
continue;
}
input_file = fopen(dptr->d_name, "r");
if(input_file == NULL)
{
perror("Cannot open file or no file exists\n");
fclose(input_file);
return 0;
}
c = fgetc(input_file);
while(c != EOF)
{
printf("%d", c);
}
printf(%s\n", dptr->d_name);
}
closedir(dp);
}
return 0;
}
我开始慢慢来。首先,我读了一个目录。然后我打印了目录中所有文件的名称。所有这些都很好(这真的很酷!)。
但是,每当我尝试在第一个segfault
内执行fclose(input_file)
时,我都会收到while loop
。起初,我认为这是因为文件中没有任何内容(我通过在文件中放置一些东西来修复它),但这不起作用。
奇怪的是,当我取出fclose(input_file)
时,它会编译,但会抛出第二个错误:Cannot open file or file doesn't exist
。
所有文件都包含不同深度的整数,每行一个。我尽力校对代码,所以如果有任何错误(拼写错误等)让我知道,我会马上编辑它。
感谢所有智慧的话语。 :d
更新:
所以我得到一个segfault
,因为input_file
是NULL
而我正试图关闭它......这是有道理的,我无法相信我错过了它。
我不明白为什么input_file
首先是NULL
。
答案 0 :(得分:0)
你得到input_file等于NULL的原因是显而易见的,因为你想要打开的这个文件不在当前目录中。
假设例如将您的工作目录视为(这是您编译C程序的地方)
/家庭/学生/ MyFolder文件
我们假设您要打开“输入”文件夹,并且有两个文件1.txt和2.txt。
编译编译器为 fopen()所做的工作后,它会搜索文件为
/home/student/Myfolder/1.txt
但实际路径是
/home/student/Myfolder/Input/1.txt
我希望你明白这一点。要解决此问题,您必须获取当前工作目录 cwd()函数,然后附加目录名称和文件名。以下是完整的计划。请注意我在程序中所做的命令。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv) {
if(2 != argc)
{
printf("Directory name missing!\n");
return 0;
}
DIR *dp = NULL;
struct dirent *dptr = NULL;
FILE *input_file;
FILE *next_file;
char c,cwd[256]; //created new character array
if (NULL == (dp = opendir(argv[1])))
{
printf("Cannot open the given directory %s", argv[1]);
exit(1);
}
else
{
while((dptr = readdir(dp))!=NULL)
{
if(!strcmp (dptr->d_name, "."))
{
continue;
}
if(!strcmp (dptr->d_name, ".."))
{
continue;
}
if(getcwd(cwd, sizeof(cwd)) == NULL) //this is important
{
printf("No such file or directory");
continue;
}
if(dptr->d_name[0]=='.') //Files never begin with '.'
continue;
strcat(cwd,"/"); //For windows "\"
strcat(cwd,argv[1]);
strcat(cwd,"/"); //For windows "\"
strcat(cwd,dptr->d_name);
printf("%s",cwd); //check for working directory
input_file = fopen(cwd, "r");
printf("%s\n",dptr->d_name); //validation check
if(input_file == NULL)
{
perror("Cannot open file or no file exists\n");
fclose(input_file);
return 0;
}
c = fgetc(input_file);
while(c != EOF)
{
printf("%d", c);
}
printf("%s\n", dptr->d_name);
}
closedir(dp);
}
return 0;
}