PDA

Voir la version complète : Aide en C



Boss_Med
15/05/2009, 09h30
Salut,
j'apprenais la gestion des fichiers en c pour ça j'ai créé un fichier qui contient des liens zip et je l'ai nommé res
puis j'ai mis le code suivant



#include<stdio.h>
#include<stdlib.h>

main()
{
FILE *fr;
char c[80];
fr = fopen("res","r");
if (fr==NULL){
printf("Fichier vide\n");
return 1;
}
else {
printf("Téléchargement des liens : \n");
while(fgets(c, 80, fr)!=NULL)
printf("%s",c); // j'affiche les liens simplement pour tester
system("wget "); //qu'est ce que je met ici pour les télécharger à savoir la fonction system ne prend qu'un seul argument
}
fclose(fr);
return 0;
}

merci pour l'aide
PS:je suis sous linux

mouradski
15/05/2009, 11h01
Salem,

Pour la fonction system, je pense qu'il suffit de concat&#233;ner le param&#232;tre C &#224; la cha&#238;ne "wget ", le programme ne continuera la boucle que lorsque cette fonction system soit termin&#233;e donc pas de soucis.

&#224; chaque it&#233;ration d ela boucle



char* parametre = "wget ";
strcat(parametre ,c);
system(parametre);

Darkvader
15/05/2009, 11h24
or try this one if mouradski's solution doesn't work.


else {
printf("T&#233;l&#233;chargement des liens : \n");
while(fgets(c, 80, fr)!=NULL)
printf("&#37;s",c);
char param[80];
strcpy(param, "wget ");
strcat(param, c);
system(param);
}

tixxDZ
15/05/2009, 11h33
LA SOLUTION a &#233;t&#233; donn&#233;e par mouradski_21 et Darkvader, voici quelques infos vraiment utiles pour un meilleur code:


1) fopen() retourne NULL en cas d'erreurs et non pas si le fichier est vide, pour avoir la d&#233;scription:
perror("erreur fichier");
/* perror() ou strerror()
si tu veut voir la taille de fichier tu utilise la fonction
stat() et la structure struct stat, le champ st_size pour les fichier
r&#233;gulier
"man 2 stat"
*/

2) tu peut utiliser la fonction getline() au lieu de fgets(), pour tout lire et ne pas t'inquit&#233; de la taille de ton buffer:
- il faut definir la macro: #define _GNU_SOURCE
- pour avoir un exemple: "man 3 getline"

3) pour que la fonction system prend plusieurs arguments:
- allou&#233; la m&#233;moire au buffer selon la taille de l'input (argument de getline() + "wget ")
size_t SIZE == strlen("wget ") + size input;
buffer = (char *) malloc (SIZE);
memset(buffer, 0x00, SIZE);
snprintf(buffer, "wget &#37;s", SIZE, url);
system(buffer);
free(buffer);
/* il faut check&#233; les erreurs */

- MIEUX ENCORE, si tu ne veut pas attendre que system() retourne:
- fork()
- execv(argv[0], argv)

- FAIT ATTENTION &#224; la valeur de url (qui la control), exemple:
url == "google.com; echo hello"
system("wget google.com; echo hello");
/* le code echo hello s'&#233;x&#233;cute aussi, faille de s&#233;curit&#233; */

4) si tu veut coder aussi ton compresseur/d&#233;compresseur: utilise la zlib
- /usr/share/doc/zlib*/
- "man zlib"
- le site de la zlib


5) UNE AUTRE MINE D'INFO pour la libc
- fait un stage bloqu&#233; avec la commande: "info libc"
- tu aura tout gestion d'&#233;rreur m&#233;moire fichier ...
ESSAYE: "info libc"

Bonne chance et si tu veut vraiment programmer au top fait le sous linux *unix et il faut lire beaucoup de code source, bonne chance.

PS: il seut peut qu'il y a des erreurs et d&#233;sol&#233; pour les fautes d'ortho.

Boss_Med
15/05/2009, 12h18
@Mouradski : le programme me donne "Erreur de segmentation".
@Darkvader : &#231;a marche mais j'ai une petite question
strcpy(param, "wget ");
strcat(param, c);
ces deux instructions vont faire quoi au juste ?

@tixxDZ : merci mon fr&#232;re tu m'a bien aid&#233; m&#232;me si il y a des choses que je ne comprend pas mais je vais me documenter.

Darkvader
15/05/2009, 12h58
@Mouradski : le programme me donne "Erreur de segmentation".
@Darkvader : ça marche mais j'ai une petite question
strcpy(param, "wget ");
strcat(param, c);
ces deux instructions vont faire quoi au juste ?

@tixxDZ : merci mon frère tu m'a bien aidé mème si il y a des choses que je ne comprend pas mais je vais me documenter.

strcpy "String Copy" copies the string "wget " into param, and then it concatenates param and c (wget + c) with strcat (String concat).


You can find all these instructions and more online.

Boss_Med
15/05/2009, 13h01
ah ok merci j'ai tr&#233;s bien compris maintenant

mouradski
15/05/2009, 13h07
@Mouradski : le programme me donne "Erreur de segmentation".


C'est sûrement qu'il n'a pas digéré le char* comme char[] :D
je pense que c'est ce que DarkVader faisait allusion, ça passe avec le même type ie tableau de char.

mais sinon si t'es sur C/C++ un "wget " + param aurait fait l'affaire car le + est un opérateur surchargé pour le type chaîne de caractères.

tixxDZ
15/05/2009, 13h35
juste une petite correction Boss_med:

et si ton buffer et un pointeur de la sorte:
char *buffer = (char *) malloc (SIZE);

alors le code suivant est incorrecte (copie seulement 4 octets):
snprintf(buffer, "wget &#37;s", sizeof(buffer), url);

car le code sizeof(buffer) va retourn&#233; 4 octets, c'est le size d'un pointeur sur 32 bits.

correction:
size_t SIZE == strlen("wget ") + size input;
char *buffer = (char *) malloc (SIZE);
snprintf(buffer, "wget %s", SIZE, url); /* snprintf() ajoute toujours le NULL '\0' &#224; la fin */

d&#233;sol&#233; c'&#233;t&#233; &#224; la va vite (la pri&#232;re) :)


comme Darkvader a dit: tu peut trouver online ou avec la commande man
n'oublie pas la commande "info libc"

@mouradski_21
c'est ton background de c# :)

salam

Boss_Med
15/05/2009, 13h58
ok je pige une chose est sur il y a beaaaaaaaacoup de chose &#224; apprendre Lol

mouradski
15/05/2009, 14h10
@mouradski_21
c'est ton background de c# :)

salam

lol :D w&#233;, vive le transtypage &#224; volont&#233; :D et comme on dit "les ignorants sont b&#233;nis" moins j'en sais sur les rouages mieux c'est :D

Darkvader
15/05/2009, 17h02
lol :D wé, vive le transtypage à volonté :D et comme on dit "les ignorants sont bénis" moins j'en sais sur les rouages mieux c'est :D

What's wrong with C#? it is a great language, you don't have to build everything from scratch, and certainly you don't have to reinvent the wheel, so don't feel offended by Tixxdz remarks. :)

C# is a subset of C++ which is a subset of C.

mouradski
15/05/2009, 17h27
What's wrong with C#? it is a great language, you don't have to build everything from scratch, and certainly you don't have to reinvent the wheel, so don't feel offended by Tixxdz remarks. :)

C# is a subset of C++ which is a subset of C.

Oui je pense aussi que le C# est un langage terriblement efficace, j'en suis même tombé amoureux :) je pense même que c'est le langage le plus productif du marché :)

Mais je penses qu'on doit arreter de trop chercher la simplilcité, d'ici quelques années on va programmer directement en UML, un clic de souris et c'est compilé :D :D et ça sera le chaumage pour toi :D

Tu lâches pas l'affaire de la roue hein :D

anubis_1001
15/05/2009, 17h31
C# is a subset of C++ which is a subset of C.
salam,
voici une citation de wikip&#233;dia:


Il est tr&#232;s proche du Java dont il reprend la syntaxe g&#233;n&#233;rale ainsi que les concepts (la syntaxe reste cependant relativement semblable &#224; celles de langages tels que le C++ et le C). Un ajout notable &#224; Java est la possibilit&#233; de surcharge des op&#233;rateurs, inspir&#233;e du C++. To^^^^ois, l'impl&#233;mentation de la red&#233;finition est plus proche de celle du Pascal Objet.

donc le c# est "un m&#233;lange" du c++ java et pascal (c# &#233;tant cr&#233;&#233; par le m&#234;me cr&#233;ateur que le pascal)

tixxDZ
15/05/2009, 18h04
Yes what Darkvader says is correct, C# is great and each language has its power.

IMHO: if you are not doing low level programming then use Java, C#, Python, ... personally i code this things with Perl or Python.

The important thing is to learn and to code cool and new stuff.

I didn't mean to offen any body it was a simple way to clarify mouradski_21 solution.

lol mouradski_21:
j'éspère que tu va me laisser nager à Ben M'hidi (il me faut une boué).

mouradski
15/05/2009, 18h23
I didn't mean to offen any body it was a simple way to clarify mouradski_21 solution.

lol mouradski_21:
j'éspère que tu va me laisser nager à Ben M'hidi (il me faut une boué).

Je viens de te blacklister auprès des gardiens des parcs auto des plages de ben m'hidi :D

non, je ne me suis pas du tout senti offensé :)

Darkvader
15/05/2009, 18h53
Oui je pense aussi que le C# est un langage terriblement efficace, j'en suis même tombé amoureux :) je pense même que c'est le langage le plus productif du marché :)

Mais je penses qu'on doit arreter de trop chercher la simplilcité, d'ici quelques années on va programmer directement en UML, un clic de souris et c'est compilé :D :D et ça sera le chaumage pour toi :D

Tu lâches pas l'affaire de la roue hein :D

lol. Drag and drop programming is already here. As for me losing my job, don't worry, there are plenty of dishes to be washed in some restaurants.

mouradski
15/05/2009, 19h05
lol. Drag and drop programming is already here. As for me losing my job, don't worry, there are plenty of dishes to be washed in some restaurants.

Je ne crois pas que tu fasses plus d'une journée dans le lavage de vaisselle :D c'est pas aussi simple qu'un Dishes.Wash() :D l'objet dans la vie réel n'est pas autonome :D il faut vraiment connaitre sa roue :)