2017-10-05 187 views
0

我一直在試圖重定向輸出到一個文件,並從文件而不是標準輸入讀取通過使用函數,但它似乎沒有工作,因爲當我重定向到一個文件並檢查看看是否已經用輸出創建了一個文件,那裏什麼也沒有。這個函數可能有什麼錯誤。重定向標準輸出到文件 - 在C

/* Redirect a standard I/O file descriptor to a file 
    * Arguments: filename the file to/from which the standard I/O file 
    *    descriptor should be redirected 
    *  flags indicates whether the file should be opened for reading 
    *   or writing 
    *  destfd the standard I/O file descriptor which shall be 
    *   redirected 
    * Returns: -1 on error, else destfd 
    */ 
    int redirect(char *filename, int flags, int destfd){ 

      int ret; 

      if(flags == 0){ 
       destfd = open(filename,O_RDONLY); 

       if (destfd < 0){ 
        return -1; 
       } 
       ret = dup2(0,destfd); 

       if(ret < 0){ 
       return -1; 
      } 
       close(destfd); 
      } 

      if(flags == 1){ 
       destfd = open(filename,O_APPEND|O_WRONLY); 

      if (destfd < 0){ 
        return -1; 
      } 

      ret = dup2(destfd,1); 

      if(ret < 0){ 
       return -1; 
      } 
      close(destfd); 
      } 
      return destfd; 
     } 
+3

爲什麼'destfd'參數傳遞給函數? –

回答

-1

os函數dup2()應該提供你所需要的(如果沒有引用你所需要的)。

更具體地說,您可以將stdin文件描述符dup2()複製到另一個文件描述符,使用stdin執行其他操作,然後在需要時複製它。

dup()函數複製一個打開的文件描述符。具體而言,它使用F_DUPFD常量命令值爲fcntl()函數提供的服務提供備用接口,其第三個參數爲0。重複的文件描述符與原始文件共享任何鎖定。

成功時,DUP()返回具有以下共同點與原來一個新的文件描述符:

相同的打開文件(或管道) 相同的文件指針(兩個文件描述符共享一個文件指針) 相同的訪問模式(讀,寫或讀/寫)

一切我說可以the manpage of dup

1

發現有幾個問題,你的代碼,而不是其中最重要的是非常糟糕的格式,這使得它很難讀書。

例如,這個對dup2的調用是反向的 - 它將用一個stdin副本替換最近打開的destfd

ret = dup2(0,destfd); 

然後幾行後您關閉destfd

if聲明可能會受益於您瞭解elseelse if

if(flags == 0) { 
// code 
} else if(flags == 1) { 
// code 
} 

真的不過你可以通過簡化治療flags參數爲相同的標誌整體功能你會傳遞給open,並有destfd爲您要替換的文件描述符。

int redirect(char *filename,int flags, int destfd) 
    { 
    int fd; 

    fd=open(filename,flags,S_IRUSR|S_IWUSR); 
    if(fd!=-1) 
     { 
     if(dup2(fd,destfd)==-1) 
      { 
      close(fd); 
      fd=-1; 
      } 
     else 
      { 
      close(fd); 
      } 
     } 
    return fd; 
    } 

然後,你可以這樣調用它

redirect("output.txt",O_CREAT|O_WRONLY,1); // Redirect stdout 
redirect("input.txt",O_RDONLY,0); // Redirect stdin 
+0

甚至在最後的調用中使用'STDOUT_FILENO'和'STDIN_FILENO'來代替1和0。 –

相關問題