2017-10-05 7 views
0

J'ai essayé de rediriger la sortie vers un fichier et de lire le fichier au lieu de stdin en utilisant une fonction, mais il ne semble pas fonctionner comme lorsque je redirige dans un fichier et vérifier pour voir si un fichier a été créé avec la sortie il n'y a rien là. Quel pourrait être le problème avec cette fonction.rediriger stdout vers fichier - dans 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

pourquoi est 'destfd' un argument à la fonction? –

Répondre

-1

La fonction os dup2() devrait fournir ce dont vous avez besoin (si ce n'est pas des références à exactement ce dont vous avez besoin). Plus spécifiquement, vous pouvez copier (2) le descripteur de fichier stdin vers un autre descripteur de fichier, faire d'autres choses avec stdin, puis le recopier quand vous le voulez.

La fonction dup() duplique un descripteur de fichier ouvert. Plus précisément, il fournit une autre interface au service fourni par la fonction fcntl() en utilisant la valeur de commande de constante F_DUPFD, avec 0 pour son troisième argument. Le descripteur de fichier dupliqué partage tous les verrous avec l'original.

En cas de succès, dup() retourne un nouveau descripteur de fichier qui a ceci en commun avec l'original:

même fichier ouvert (ou pipe) pointeur de fichier identique (les deux descripteurs de fichiers partagent un pointeur de fichier) mode d'accès même (lecture, écriture ou lecture/écriture)

Tout ce que je dit se trouve sur the manpage of dup

1

il y a plusieurs problèmes avec votre code, et non des moindres la mise en forme vraiment terrible qui le rendent très difficile lire.

Par exemple, cet appel à dup2 est en arrière - il remplace le destfd récemment ouvert avec une copie de stdin.

ret = dup2(0,destfd); 

un puis plus tard quelques lignes vous fermez destfd.

Vos déclarations if pourraient bénéficier de vous renseigner sur else et else if

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

Vraiment si vous pouvez simplifier toute la fonction en traitant le paramètre flags les mêmes drapeaux que vous souhaitez passer à open et ont destfd comme le descripteur de fichier que vous voulez remplacer.

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; 
    } 

Ensuite, vous pouvez l'appeler comme

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

Ou même utiliser 'STDOUT_FILENO' et' STDIN_FILENO' à la place de 1 et 0 dans les derniers appels. –