检查目录时指针问题

时间:2016-02-14 22:36:05

标签: c pointers gcc

我正在创建一个函数(一个更大的项目的一部分),它检查C中是否存在文件。这是代码:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int file_exist(file_path, file_name)
{
  DIR *dp;
  FILE *fc;
  struct dirent *ep;

 dp = opendir(file_path);
 fc = fopen(file_name, "r");
  if(dp = NULL)
    error_escape("Opening path");
  else
    chdir(file_path);
  if(fc = NULL)
  {
    error_escape("Opening file");
    return(-1);
  }
  else
    return(0);
}

然而,当我尝试编译它时,我得到了这个结果:

file_exist.c: In function ‘file_exist’:
file_exist.c:10:15: warning: passing argument 1 of ‘opendir’ makes pointer from integer without a cast
  dp = opendir(file_path);
               ^
In file included from file_exist.c:3:0:
/usr/include/dirent.h:134:13: note: expected ‘const char *’ but argument is of type ‘int’
 extern DIR *opendir (const char *__name) __nonnull ((1));
             ^
file_exist.c:11:13: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast
  fc = fopen(file_name, "r");
             ^
In file included from file_exist.c:1:0:
/usr/include/stdio.h:272:14: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
 extern FILE *fopen (const char *__restrict __filename,
              ^

我已经在很多地方寻找解决方案,并尝试了许多不同的事情,看看我是否可以解决它,但我不知道该怎么做。提前感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

file_exist.c: In function ‘file_exist’:
file_exist.c:10:15: warning: passing argument 1 of ‘opendir’ makes pointer from integer without a cast
  dp = opendir(file_path);
               ^

导致此错误的原因是您的函数声明为

int file_exist(file_path, file_name)

由于未声明参数的类型,因此假定它们为int。你需要用

代替这一行
int file_exist(char *file_path, char *file_name)

然而,正如David van rijn指出的那样,你正在做的事情

if(dp = NULL)

并将dp的值替换为NULL,而不是检查它。你需要写

if(dp == NULL)

此外,您的代码中存在逻辑错误(在这些修复之后):

int file_exist(char *file_path, char *file_name)
{
  DIR *dp;
  FILE *fc;
  struct dirent *ep;

  dp = opendir(file_path);
  fc = fopen(file_name, "r");
  if(dp == NULL)
    error_escape("Opening path");
  else
    chdir(file_path);
  if(fc == NULL)
  {
    error_escape("Opening file");
    return(-1);
  }
  else
    return(0);
}

因为您在转到正确的目录之前打开了文件。您需要在chdir

之前执行fopen
int file_exist(char *file_path, char *file_name)
{
  DIR *dp;
  FILE *fc;
  struct dirent *ep;

  dp = opendir(file_path);
  if(dp == NULL)
    error_escape("Opening path");
  else
    chdir(file_path);

  fc = fopen(file_name, "r");
  if(fc == NULL)
  {
    error_escape("Opening file");
    return(-1);
  }
  else
    return(0);
}

最后,您的代码泄漏了文件描述符,因为您没有关闭正在打开的目录和文件。你需要做一些像

这样的事情
int file_exist(char *file_path, char *file_name)
{
  DIR *dp;
  FILE *fc;
  struct dirent *ep;

  dp = opendir(file_path);
  if(dp == NULL)
    error_escape("Opening path");
  else
    chdir(file_path);
  closedir(dp);

  fc = fopen(file_name, "r");
  if(fc == NULL)
  {
    error_escape("Opening file");
    return(-1);
  }
  else {
    close(fc);
    return(0);
  }
}

更好的方法是:

int file_exist(char *file_path, char *file_name)
{
  int dir;
  FILE *fc;

  dir = chdir(file_path);
  if (dir == -1) {
    error_escape("Opening path");
    return -1;
  }

  fc = fopen(file_name, "r");
  if(fc == NULL)
  {
    error_escape("Opening file");
    return(-1);
  }
  else {
    close(fc);
    return(0);
  }
}

答案 1 :(得分:0)

我认为问题是===之间的差异。即。一个是任务,另一个是比较。 所以转过来

if(dp = NULL)

if(dp == NULL)

if(!dp)

因为现在您要将NULL分配给dp。 Ť

这与警告无关,但如果我是你,我也会修理它们。