我有一个程序接受命令行参数,检查它们是否是文件,如果是,则执行某些操作,如果没有,则执行其他操作。
我的基本结构看起来像这样
for (i=1;i<argc-1;i++){
if ((fp=open (argv[i],"r"))==NULL){
#Do blah blah
}
else{
#do blah blah
}
}
但由于某种原因,当我的参数不是文件时,而不是做等等,它会返回一个错误,说它不是目录或文件。我的if语句有问题吗?
答案 0 :(得分:3)
如果出现问题,open()
系统调用将返回负值,因此fp
技术上不会是NULL
。
另外,正如@ Kninnug的评论中所述,open期望将int作为其第二个参数,因此您需要O_RDONLY
而不是"r"
尝试将其修改为
if((fp=open(argv[i], O_RDONLY))==-1)
或者,请使用@ Kninnug的建议并使用fopen()
。如果您这样做,则需要FILE *
指针而不是int
。
答案 1 :(得分:0)
您的文件名将在argv [1]中。因此,您应该for (i=1;i<argc-1;i++){
代替for (i=1;i<argc;i++){
而不是{{1}}
`
答案 2 :(得分:0)
更改
if ((fp=open (argv[i],"r"))==NULL)
要
if((fp=open(argv[i],"r"))==-1)
答案 3 :(得分:0)
检查参数是否是文件的路径并尝试打开文件是两回事。 fopen()
失败的原因有很多,但参数是合法的文件名。
要查看参数是否为文件,请使用stat()
。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int isfile(const char *path) {
struct stat buf;
int retval = stat(path, &buf);
// A pedantic approach would also check the `errno`.
if (retval) return 0;
switch (buf.st_mode & S_IFMT) {
case S_IFREG: return 1;
// Maybe other cases could return 1 depending on OP's needs.
}
return 0;
}