簡體   English   中英

如果參數不是文件,則從標准輸入中讀取

[英]If argument isn't a file, then read from 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;i++){而不是for (i=1;i<argc-1;i++){

更改

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

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

檢查參數是否為文件的路徑並嘗試打開文件是兩件事。 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM