我正在创建一个函数(一个更大的项目的一部分),它检查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,
^
我已经在很多地方寻找解决方案,并尝试了许多不同的事情,看看我是否可以解决它,但我不知道该怎么做。提前感谢您提供任何帮助。
答案 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。 Ť
这与警告无关,但如果我是你,我也会修理它们。