J'ai cherché mais je n'ai pas trouvé de réponse pertinente à cette question, je travaille sur une machine linux, je voulais vérifier si le flux d'entrée standard contient un caractère, sans supprimer les caractères du flux.
Réponses
Trop de publicités?Vous pouvez essayer sélectionner() et attendre d'avoir des données dans le flux d'entrée.
Description :
sélectionner() et pselect() permettent à un programme de surveiller plusieurs fichiers fichiers, en attendant qu'un ou plusieurs de ces descripteurs deviennent "prêts" pour une certaine classe d'opérations d'E/S (par exemple, entrée possible). Un descripteur fichier est considéré comme prêt s'il est possible d'effectuer l'opération d'E/S l'opération d'E/S correspondante (par exemple, read(2)) sans blocage.
Dans votre cas, le descripteur de fichier sera stdin
void yourFunction(){
fd_set fds;
struct timeval timeout;
int selectRetVal;
/* Set time limit you want to WAIT for the fdescriptor to have data,
or not( you can set it to ZERO if you want) */
timeout.tv_sec = 0;
timeout.tv_usec = 1;
/* Create a descriptor set containing our remote socket
(the one that connects with the remote troll at the client side). */
FD_ZERO(&fds);
FD_SET(stdin, &fds);
selectRetVal = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
if (selectRetVal == -1) {
/* error occurred in select(), */
printf("select failed()\n");
} else if (selectRetVal == 0) {
printf("Timeout occurred!!! No data to fetch().\n");
//do some other stuff
} else {
/* The descriptor has data, fetch it. */
if (FD_ISSET(stdin, &fds)) {
//do whatever you want with the data
}
}
}
J'espère que cela vous aidera.
Cacho était sur la bonne voie, cependant select
n'est nécessaire que si vous avez affaire à plus d'un descripteur de fichier, et stdin
n'est pas un descripteur de fichier POSIX ( int
) ; C'est un FILE *
. Il faut utiliser STDIN_FILENO
si vous choisissez cette voie.
Ce n'est pas non plus une route très propre à prendre. Je préfère utiliser poll
. En spécifiant 0 comme timeout
le sondage reviendra immédiatement.
Si aucun des événements définis ne s'est produit sur un fichier sélectionné sélectionné, poll() attendra au moins le délai d'attente de millisecondes pour qu'un événement se produise sur l'un des descripteurs de fichiers sélectionnés. Si la valeur de timeout est 0, poll() revient immédiatement. Si la valeur de timeout est -1, poll() se bloque jusqu'à ce qu'un événement demandé se produise ou jusqu'à ce que l'appel soit interrompu.
struct pollfd stdin_poll = { .fd = STDIN_FILENO
, .events = POLLIN | POLLRDBAND | POLLRDNORM | POLLPRI };
if (poll(&stdin_poll, 1, 0) == 1) {
/* Data waiting on stdin. Process it. */
}
/* Do other processing. */