[C] Redirection de stdin vers un buffer mémoire

Hello,
Me souviens plus comment on redirige stdin vers un buffer mémoire. L’idée étant d’utiliser des fonctions comme gets() sur ce buffer.
Je farfouille dans les streams, mais si quelqu’un peut me ressortir le code miracle, ça me fera toujours ça de gagné…
Précision : c’est du C standard (die C++, die !)
Merciiiiiiii

Antoine

euh… fread?

[code]NAME
stdin, stdout, stderr - standard I/O streams

SYNOPSIS
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;[/code]
C’est un FILE au meme titre que ce que rend fopen, sauf qu’il est pre initialise et qu’il n’est pas necessaire d’utiliser fopen pour l’utiliser.

C’est du untested B)

LoneWolf
Ca fait un bail… B)

Nope, en faisant un fread sur stdin il va simplement attendre des entrées au clavier.
En l’occurence, je cherche à rediriger stdin vers un buffer. Ou encore, dit autrement, je cherche à modifier le buffer de stdin pour qu’il ne soit plus celui du clavier mais un buffer à moi.

Antoine

Tu es sûr qu’on peut ? Les fonctions sur les FILE tiennent aussi compte des EOF par exemple, je ne vois pas trop comment ça serait géré avec ton buffer…

A tout hasard (je débute), un truc dans ce genre-là ça n’irait pas ?

[code]#include <stdio.h>
#include <unistd.h>

int main(void)
{
int buffer[256];

dup2(buffer[0], STDIN_FILENO);

return 0;

}[/code]

[quote=“DaP, post:5, topic: 45479”]A tout hasard (je débute), un truc dans ce genre-là ça n’irait pas ?

[code]#include <stdio.h>
#include <unistd.h>

int main(void)
{
int buffer[256];

dup2(buffer[0], STDIN_FILENO);

return 0;

}[/code][/quote]
Etant donné que dup2 prend en entrée des descripteurs de fichiers (donc un index dans ta table de descripteurs), ton code ne correspond à rien…
Et puis Antoine est avec des FILE* (donc du C ANSI), les descripteurs de fichiers et dup/dup2 c’est du POSIX.

[quote=“AntoineViau, post:1, topic: 45479”]Hello,
Me souviens plus comment on redirige stdin vers un buffer mémoire. L’idée étant d’utiliser des fonctions comme gets() sur ce buffer.
Je farfouille dans les streams, mais si quelqu’un peut me ressortir le code miracle, ça me fera toujours ça de gagné…
Précision : c’est du C standard (die C++, die !)[/quote]
Je vois pas de moyen simple de faire ca. Mais ce que tu peux faire facilement c’est avoir un filedescriptor sur lesquel tout ce qui arrive est redirigé sur stdin :

int p[2]; pipe(p); dup2(p[0], STDIN_FILENO); close(p[0]);
Ensuite il te suffit d’écrire sur p[1].

[quote=« DaP, post:5, topic: 45479 »]A tout hasard (je débute), un truc dans ce genre-là ça n’irait pas ?

[code]#include <stdio.h>
#include <unistd.h>

int main(void)
{
int buffer[256];

dup2(buffer[0], STDIN_FILENO);

return 0;

}[/code][/quote]
Non non ca marche pas. Enfin ca fait un truc indefini. Tu rediriges un FD aleatoire (suivant ce qui se trouve dans buffer[0] qui n’est pas initialisé) vers stdin.

Heu, les FILE* c’est POSIX aussi, et on peut aussi très bien utiliser des descripteurs de fichiers et dup/dup2 en C ANSI. Bref, n’importe quoi ces histoires de C ANSI / POSIX B)

[quote=“BokLM, post:8, topic: 45479”]Non non ca marche pas. Enfin ca fait un truc indefini. Tu rediriges un FD aleatoire (suivant ce qui se trouve dans buffer[0] qui n’est pas initialisé) vers stdin.
Heu, les FILE* c’est POSIX aussi, et on peut aussi très bien utiliser des descripteurs de fichiers et dup/dup2 en C ANSI. Bref, n’importe quoi ces histoires de C ANSI / POSIX B)[/quote]
Non mais Antoine ne précisait pas la plateforme qu’il utilise, juste qu’il veut du C standard. C’est pour ça que je soulignais que dup() est disponible sur les plateformes compatibles POSIX, est-ce que c’est le cas de Windows par exemple ? Je ne code pas sous Windows donc je ne peux pas vérifier.

Je pense que le problème ici vient de savoir qu’est ce que tu veux faire EXACTEMENT avec stdin B)
(BokLM & DaP attention on a déjà brulé des gens pour moins que ça B) Vous me direz à voix haute 5 man dup(2) pour votre rédemption)

Bon visiblement tu veux stocker les données qui arriveront sur stdin dans un buffer et, par la suite, utiliser un ‹ gets like › sur ce buffer.

Je comprend pas l’intérêt de la manoeuvre puisque stdin est déjà bufférisé.

En effet :

jdam@grand-pingouin:/tmp$ cat > a.c #include <stdio.h> #include <stdlib.h> int main(int argc,char** argv) { char buffer[4096]; sleep(10); if(!fgets(buffer,4096,stdin)) { perror("Ahhh!:"); exit(-1); } printf("buffer=#%s#\n",buffer); return 0; } jdam@grand-pingouin:/tmp$ gcc a.c jdam@grand-pingouin:/tmp$ echo "Vivent les loutres" |./a.out buffer=#Vivent les loutres #

Malgrès le sleep(10) fgets attrape quand même l’entrée (‹ echo « bla »| › équivaut à rentrer le tout au clavier) malgrès le fait que l’appel soit effectué 10s après l’envoi dans stdin de « Vivent les loutres ».

Donc voilà de deux choses l’une: soit j’ai pigé ton pb et en fait il n’y en a pas (:D) soit je n’ai (à nouveau) rien compris et dans ce cas il va falloir l’expliquer plus en détails.

EDIT car je n’avais rien compris à la question au début :smiley: