c语言 - 如果参数不是文件,则从 stdin 读取



我有一个程序,可以进行命令行参数,检查它们是否是文件,如果是文件,请做某事,如果没有,请做其他事情。

我看起来像这样的基本结构

for (i=1;i<argc-1;i++){
    if ((fp=open (argv[i],"r"))==NULL){
        #Do blah blah
    }
    else{
        #do blah blah
    }
}

但是,由于某种原因,当我的参数不是文件时,而不是这样做时,它会返回一个错误,说它不是目录或文件。我的if语句有什么问题吗?

如果存在问题,open()系统调用将返回负值,因此fp从技术上讲不会是NULL

另外,如 @kninnug的评论中所述,Open期望INT是其第二个参数,因此您需要O_RDONLY而不是"r"

尝试将其融合到

if((fp=open(argv[i], O_RDONLY))==-1)

或与 @kninnug的建议一起使用并使用fopen()。如果这样做,则需要FILE *指针而不是int

您的文件名将在argv [1]中。因此,代替for (i=1;i<argc-1;i++){,您应该有for (i=1;i<argc;i++){`

更改

if ((fp=open (argv[i],"r"))==NULL)

to

if((fp=open(argv[i],"r"))==-1)

检查参数是否是文件的途径,并试图打开文件是2个不同的内容。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;
}

相关内容

最新更新