_dup, _dup2
Créez un deuxième modèle de fichier pour un fichier ouvert (_dup), ou réassignez un modèle de fichier (_dup2).
int _dup(
int fd
);
int _dup2(
int fd1,
int fd2
);
Paramètres
fd, fd1
Modèles de fichier faisant référence au fichier ouvert.fd2
Tout modèle de fichier.
Valeur de retour
_dup retourne un modèle de fichier._dup2 retourne 0 pour indiquer le succès.Si une erreur se produit, retourne de chaque fonction à 1 et définit errno à EBADF si le modèle de fichier non valide ou à EMFILE si plus de modèles de fichier ne sont disponibles.Dans le cas d'un modèle de fichier non valide, la fonction appelle également le gestionnaire de paramètre non valide, comme décrit dans Validation des paramètres.
Pour plus d'informations sur ces derniers et d'autres codes de retour, consultez l' _doserrno, errno, _sys_errlist, et _sys_nerr.
Notes
Les fonctions d' _dup et d' _dup2 associent un deuxième modèle de fichier actuellement avec un fichier ouvert.Ces fonctions peuvent être utilisées pour associer un modèle de fichier intégré, tels que ceux pour stdout, avec un autre fichier.Les opérations sur le fichier peuvent être exécutées à l'aide de l'un ou l'autre de modèle de fichier.Le type d'accès autorisé pour le fichier est non affecté par la création d'un modèle._dup retourne le prochain modèle de fichier disponible pour le fichier donné._dup2 force fd2 pour faire référence au même fichier qu' fd1.Si fd2 est associé à un fichier ouvert au moment de l'appel, ce fichier est fermé.
_dup et _dup2 reçoivent des modèles de fichier en tant que paramètres.Pour passer un flux (FILE *) à l'un ou l'autre de ces fonctions, utilise _fileno.La routine d' fileno retourne le modèle de fichier actuellement associées au flux donné.L'exemple suivant montre comment associer stderr (sous la forme FILE* dans Stdio.h) avec un modèle de fichier :
int cstderr = _dup( _fileno( stderr ));
Configuration requise
Routine |
En-tête requis |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
La console n'est pas prise en charge dans les applications d' Windows Store .Les handles standard de flux de données associés à la console, stdin, stdout, et stderr, doivent être redirigés pour que les fonctions runtime C peuvent les utiliser dans des applications d' Windows Store .Pour plus d'informations de compatibilité, consultez l' Compatibilité dans l'introduction.
Exemple
// crt_dup.c
// This program uses the variable old to save
// the original stdout. It then opens a new file named
// DataFile and forces stdout to refer to it. Finally, it
// restores stdout to its original state.
//
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
int old;
FILE *DataFile;
old = _dup( 1 ); // "old" now refers to "stdout"
// Note: file descriptor 1 == "stdout"
if( old == -1 )
{
perror( "_dup( 1 ) failure" );
exit( 1 );
}
_write( old, "This goes to stdout first\n", 26 );
if( fopen_s( &DataFile, "data", "w" ) != 0 )
{
puts( "Can't open file 'data'\n" );
exit( 1 );
}
// stdout now refers to file "data"
if( -1 == _dup2( _fileno( DataFile ), 1 ) )
{
perror( "Can't _dup2 stdout" );
exit( 1 );
}
puts( "This goes to file 'data'\n" );
// Flush stdout stream buffer so it goes to correct file
fflush( stdout );
fclose( DataFile );
// Restore original stdout
_dup2( old, 1 );
puts( "This goes to stdout\n" );
puts( "The file 'data' contains:" );
_flushall();
system( "type data" );
}