打印目录C编程

时间:2017-04-08 01:07:15

标签: c

你好,晚上好,

我正在制作一个程序,它将收集给定目录中的所有文件并打印出其中的所有整数。

这是作业,但不是作业。这是我无法弄清楚的一小部分。

以下是代码:

#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_fileNULL而我正试图关闭它......这是有道理的,我无法相信我错过了它。

我不明白为什么input_file首先是NULL

1 个答案:

答案 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;
}