copier le résultat d'une commande dans un fichier - Programmation
Marsh Posté le 31-03-2006 à 14:55:32
ifconfig eth0 > mon_fichier ?
Marsh Posté le 31-03-2006 à 15:55:15
lis de la documentation sur les redirections d'entrées / sorties en shell.
dans la commande que t'a donnée mirtouf :
ifconfig eth0 > mon_fichier |
le '>' sert à rediriger la sortie de l'instruction 'ifconfig eth0' dans le fichier 'mon_fichier'.
Marsh Posté le 31-03-2006 à 16:02:42
quel programme ?
on t'a fournis une commande exécutable dans un shell.
Marsh Posté le 31-03-2006 à 16:05:50
Je suis entrain de faire un programme qui permet de lire un fichier et d'extraire des informations de ce fichier.
Ce fichier est le résultat par exemple de # ifconfig eth0.
Le but est de pouvoir le mettre dans un fichier que je vais ensuite utiliser.
Marsh Posté le 31-03-2006 à 16:08:08
ah, oui un programme en C.
Tu peux l'appeler avec system
Ex:
ret=system("ifconfig eth0 > mon_fichier" ); |
Marsh Posté le 31-03-2006 à 16:24:31
tu peux aussi te passer de fichier intermédiaire en faisant
Code :
|
tu lis directement la sortie standard de 'ifconfig eth0' dans ton flux.
Marsh Posté le 31-03-2006 à 16:33:15
Mais il ne compile pas voici mon code:
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
/*copier le résultat d'une commande dans un fichier*/
FILE *fichier=popen( ""ifconfig eth0", "r" ) /
int nblignefichier(char fichier[40])
{
int n = 0; /* nombre de lignes lues */
char ligne[256];
FILE *f = fopen( fichier, "r" ); /* ouvre en lecture */
if (f==NULL) {
printf("erreur ouverture\n" );
return 0; /* sort du programme (code erreur 1) */
}
while (fgets( ligne, 256, f ) != NULL) { /* essai lecture ligne */
n++;
}
fclose(f); /* ferme le fichier */
return n;
}
Marsh Posté le 31-03-2006 à 16:48:14
où est le main() ?
un ";" après FILE *fichier...
Citation : Mais il ne compile pas voici mon code: |
Quelles erreurs ?
Marsh Posté le 31-03-2006 à 16:52:35
c'est pas
" |
mais un
" |
leforum bug un peu...
Si tu disais ce que tu voulais faire, on pourrait t'aider un peu mieux
Tu as des connaissances en programmation C ?
Marsh Posté le 31-03-2006 à 16:55:21
Autre chose, quel est le but de ton programme ? car il est probable qu'un langage comme Perl, sh suffisent au lieu de sortir l'artillerie lourde (C)
Marsh Posté le 31-03-2006 à 16:56:38
jlighty a écrit : Autre chose, quel est le but de ton programme ? car il est probable qu'un langage comme Perl, sh suffisent au lieu de sortir l'artillerie lourde (C) |
Marsh Posté le 31-03-2006 à 17:10:54
Je me débrouille un peu en C, le seul langage que j'apprends.
Je m'explique à nouveau.
J'ai déjà fait un programme pour lire un fichier contenant des informations spécifiques. Mon problème est de pouvoir directement utiliser le fichier dans mon programme.
En supposant que le fichier est par exemple test.dat et que je connais sa structure, voilà le programme qui va avec:
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
typedef struct {
int nb1;
int nb2;
char t1[40];
char t2[40];
char t3[40];
char t4[40];
}bloc;
int nblignefichier(char arg2[40])
{
int n = 0; /* nombre de lignes lues */
char ligne[256];
FILE *f = fopen( arg2, "r" ); /* ouvre en lecture */
if (f==NULL) {
printf("erreur ouverture\n" );
return 0; /* sort du programme (code erreur 1) */
}
while (fgets( ligne, 256, f ) != NULL) { /* essai lecture ligne */
n++;
}
fclose(f); /* ferme le fichier */
return n;
}
int main(void)
{
int i,a,taille,pos1;
/* Sélectionner le fichier*/
exec("" );
/*FILE *fichier = popen( ""ls /proc", "r" );*/
FILE* lecture = fopen("test.dat","r" );
taille = nblignefichier("test.dat" );
//création du tableau de taille "taille"
bloc b[taille];
char nb[255];
//remplissage du tableau
for(i=0;i<taille;i++)
{
fscanf(lecture, "%s", &nb);
b[i].nb1 = atoi(nb);
fscanf(lecture, "%s", &nb);
b[i].nb2 = atoi(nb);
fscanf(lecture, "%s", &b[i].t1);
fscanf(lecture, "%s", &b[i].t2);
fscanf(lecture, "%s", &b[i].t3);
fscanf(lecture, "%s", &b[i].t4);
}
/* pclose(fichier);*/
fclose(lecture);
//affichage du tabeau
for(i=0;i<taille;i++)
{
printf("%d %d %s %s %s %s\n",b[i].nb1,b[i].nb2,b[i].t1,b[i].t2,b[i].t3,b[i].t4);
}
system("PAUSE" );
// la 1ere colonne s'obtient avec b[i].nb1
// la 2e colonne s'obtient avec b[i].nb2
return EXIT_SUCCESS;
}
Cependant, test.dat doit être le fichier contenant le résultat de 'ls /proc' selon cet exemple.
Je voudrais faire la même chose pour le résultat de 'ifconfig'...
Le problème est de pouvoir mettre dans un fichier chaque résultat de chaque commande.
Je pousse des cheveux blancs, aidez moi!!!
Merci
Marsh Posté le 31-03-2006 à 17:24:41
d'accord c'est plus un challenge personnel
Citation : Le problème est de pouvoir mettre dans un fichier chaque résultat de chaque commande. |
system("/sbin/ifconfig > test.dat" ); |
ne marche pas ? erreur de compilation ?
Juste par curiosité : après avoir parsé le fichier test.dat, que feras tu des données ? (mise à part leur affichage)
PS: utilise la balide "cpp" pour mettre en forme ton code dans ton post.
Marsh Posté le 31-03-2006 à 17:36:32
ben juste après ton commentaire /* Sélectionner le fichier*/
Ainsi le fichier test.dat contiendra le résultat de la commande ifconfig puis le parsage s'effectuera (nblignefichier()..).
Marsh Posté le 31-03-2006 à 17:42:21
Compilation OK.
A l'exécution: "Le chemin d'accès spécifié est introuvable".
C'est déjà une bonne voie.
Merci, je vais chercher encore suivant cette piste et trouver le chemin exact du fichier.
Merci.
Marsh Posté le 31-03-2006 à 17:46:10
bizarre, je viens de faire un test
|
et ça marche, /tmp/toto.dat contient le résultat de ifconfig
Marsh Posté le 31-03-2006 à 17:52:25
C'est vrai ton programme marche, je viens de le tester aussi.
Marsh Posté le 31-03-2006 à 14:52:27
Bonjour,
Quelqu'un saurait comment copier le résultat d'une commande dans un fichier? Par exemple
~# ifconfig eth0
eth0 Lien encap:Ethernet HWaddr 00:xx:xx:xx:xx:xx
inet adr:192.1xx.xx.xxx Bcast:192.1xx.xx.xxx Masque:255.xxx.xxx.x
adr inet6: feXX::xxx:xxxx:xxxx:xxxx/xx Scope:Lien
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
RX bytes:0 (0.0 b) TX bytes:378 (378.0 b)
Interruption:12 Adresse de base:0xd800
Récupérer ce résultat dans un autre fichier.
Merc