popen, parcourir le resultat [C] - C - Programmation
Marsh Posté le 20-01-2007 à 14:50:11
tu peux pas rewind un pipe, ce n'est pas un flux positionnable. C'est pas la faute au FILE*, c'est juste un pipe.
Marsh Posté le 20-01-2007 à 15:11:23
ah oui, en faite FILE n'est pas un type en soit c'est ca ? c'est un define sur un type du genre char ?et vu qu'on utilise un pointeur, en faite ca pointe une structure qui n'est pas la même avec fopen() et popen().
J'ai beau cherché je ne trouve que des exemple pour lire des fichiers, rien sur FILE en lui même.
edit --
ouais en faite maintenant je me demande si ce n'est pas tout simplement au niveau du systeme que ce fait la distinction entre un fichier et un pipe.
En faite je n'en sais rien >.<
Marsh Posté le 20-01-2007 à 15:24:25
ffomnislash a écrit : ah oui, en faite FILE n'est pas un type en soit c'est ca ? |
C'est un alias sur un type qui dépend de l'implémentation. On ne sait pas ce que c'est exactement et on a pas à le savoir.
Marsh Posté le 20-01-2007 à 15:26:46
ok et c'est donc pour ca que c'est en majuscule.
Sinon une idée de comment je pourrait gérer mes données ? j'avais pensé à les copier dans un fichier temporaire afin d'utiliser FILE et les fonctions associées.
Marsh Posté le 20-01-2007 à 15:42:21
ffomnislash a écrit : ok et c'est donc pour ca que c'est en majuscule. |
Pas particulièrement, non. Les hasards de l'écriture des interfaces de la bibliothèque standard, qui ne sont pas un modèle d'homogénéité... Mais bon, il y a un coté vieux cuir patiné qui me plait bien. Ca résonne avec mon âme d'artisan...
Marsh Posté le 20-01-2007 à 15:44:19
ffomnislash a écrit : ouais en faite maintenant je me demande si ce n'est pas tout simplement au niveau du systeme que ce fait la distinction entre un fichier et un pipe. |
t'as aussi le droit de RTFM histoire de savoir ce qu'un un pipe.
Marsh Posté le 20-01-2007 à 20:39:52
ffomnislash a écrit : ok et c'est donc pour ca que c'est en majuscule. |
Emmanuel Delahaye a écrit : Pas particulièrement, non. Les hasards de l'écriture des interfaces de la bibliothèque standard, qui ne sont pas un modèle d'homogénéité... |
C'est vrai que question homogénéité, je verrais mieux un type "file_t" plutôt que "FILE" mais bon. Si tout était strictement conforme au moule, ce serait bien triste...
ffomnislash a écrit : Sinon une idée de comment je pourrait gérer mes données ? j'avais pensé à les copier dans un fichier temporaire afin d'utiliser FILE et les fonctions associées. |
Si tu dois juste lire simplement les données, le popen est parfait. Si tu dois les traiter (y revenir, etc) alors faut que tu passes par un fichier car le traitement du pipe se fait dans le noyau Unix. Si une donnée est lue du pipe, elle disparait tout comme un effet quantique disparait quand on le regarde et ça t'y peux absolument rien.
Marsh Posté le 25-01-2007 à 11:51:00
oula je vous ai laissé sans réponse
Bon alors finalement j'ai tout simplement mis le résultat de la commande dans un char* tab[1024].
Le principe du pipe je le connait, c'est juste que l'implémentation avec le type FILE est "déroutant" et j'ai cherché à trop comprendre je pense >.<
Marsh Posté le 25-01-2007 à 21:29:14
ffomnislash a écrit : Bon alors finalement j'ai tout simplement mis le résultat de la commande dans un char* tab[1024]. |
SUPAIRE !!! Mais quelle jolie idée tu as eu là !!! T'as tout stocké dans un tableau de... 1024 pointeurs. J'espère que t'as au-moins pensé aux malloc qui vont bien. Maintenant (je présume que tu stockes chaque ligne dans un des 1024 pointeurs), si le résultat fait plus de 1024 lignes ben c'est pas grave, de toute façon c'est un programme destiné à des gars qui vont le payer sans regarder le code et s'il buggue on leur refacturera le débugging. Et puis si le résultat de ma commande ne rentre pas tout entier dans la RAM je leur dirai que c'est normal, que ce genre de soft poussé nécessite vâchement plus de mémoire et comme ça je pourrai leur vendre aussi des barettes mémoire...
T'es mûr pour aller bosser chez Microsoft...
Marsh Posté le 20-01-2007 à 14:07:39
Je rencontre un petit problème. J'utilise la fonction popen() pour exécuter une commande et pclose() pour fermer le fichier résultat.
J'aurait besoin de parcourir 2 fois le résultat, je pensait donc utiliser la fonction rewind() pour revenir en début du fichier (ou l'équivalent avec seek()) seulement je reste toujours en fin de fichier.
Je me suis donc dit que ce devait être la différence entre un FILE* ouvert avec fopen() (file) et avec popen() (pipe). Je me demandais si il existé une solution autre que copier mon résultat dans un tableau de chaine et ensuite le traiter ?
merci d'avance