(language c) délimiteur
Répondre à la discussion
Affichage des résultats 1 à 25 sur 25

(language c) délimiteur



  1. #1
    GECKO00

    (language c) délimiteur


    ------

    Bonjour,

    Pour un exercice de TP je dois faire un programme qui fait à peu prés la meme chose que la commande cut. A savoir que l'utilisateur donne un delimiteur et un nombre(N)et je dois écrire dans un fichier ce qu'il y a entre le délimiteur numéro N et le prochain. Exemple: si le delimiteur est ',' et N= 3

    Ce texte, est, un exemple, donné, à titre, d'exemple.

    Après la 3 iéme virgule il y a "donné" donc mon programme va écrire cette chaine de caractère dans le fichier de destination. Le probléme c'est que je n'arrive pas du tout à faire ce programme, j'ai fait plusieurs essai mais rien ne marche. Donc j'espere que vous pourrez m'aider. Voila le programme que j'ai fait pour l'instant(pour l'instant j'essaye juste d'ecrire ce qu'il y a après le Nieme delimiteur):

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    
      char c;
    
        FILE* fichier = NULL;
        FILE* fichiers = NULL;
        char* argu= argv[1];
        int pos=0;
        int coll=atoi(argv[2]);
    
        int nbcar=0;
        char* recherche;
        char caractereActuel[200];
        char ligne[200];
        char fin[200];
    
        fichier = fopen("source.txt", "r");
        fichiers = fopen("dest.txt", "w");
    
    
    
    
     
         while( fread(&c,1,1,fichier)>0 ) {
         nbcar=nbcar+1;
    
        if(c==argu[0]) 
        {
          
          pos= pos+1;
          if (pos==coll)
          {
    	
            fgets(ligne,nbcar,fichier); 
    	fgets(caractereActuel,200,fichier); 
          }
        }
        
    
         }
    
    fputs (caractereActuel, fichiers);
    
    
    
    	
    	
    	fclose(fichier);
    	fclose(fichiers);
        
        return 0;
    }
    MERCI D'AVANCE

    -----
    Dernière modification par GECKO00 ; 05/10/2011 à 17h41.

  2. #2
    GECKO00

    Re : (language c) délimiteur

    Petite modification



    while( fread(&c,1,1,fichier)>0 ) {
    nbcar=nbcar+1;

    if(c==argu[0])
    {

    pos= pos+1;
    if (pos==coll)
    {

    fgets(ligne,nbcar,fichier); lit tout jusqu'a la premiere virgule
    fgets(caractereActuel,200,fich ier); lit le reste
    }
    }


    }


    fputs (caractereActuel, fichiers); écrit le reste dans le fichier





    fclose(fichier);
    fclose(fichiers);

    return 0;

  3. #3
    invite4492c379

    Re : (language c) délimiteur

    Hello,

    Bienvenue dans le monde du C

    en première approche c'est pas trop mal. L'algo est :
    Code:
        ouvrir input en lecture
        ouvrir output en écriture
    
        tant que (non fin(input))
            ligne = lire(input)
            position = position( delimiteur, N, ligne)
            si (position valide)
                ecrire(output, ligne(de postion+1 à fin))
            fin si
        fin tant que
    
        fermer input
        fermer output
    où position(delimiteur, N, ligne) renvoie la position du Nème délimiteur dans la chaine ligne si elle existe ou -1 par exemple si elle n'existe pas.

    Ça c'est le squelette de base. Il va falloir ajouter toutes la gestion des erreurs (90% du boulot). Cela signifie :

    * vérifier les arguments en ligne de commande
    tu t'attends à un cut , 3 mais le user ne rentre rien ou donne cut hello world
    * vérifier que les fichiers ont pu être ouverts, gérer l'écrasement éventuel de output
    que faire si le fichier input n'existe pas, le fichier output existe déjà, l'OS n'a pu créer le fichier ....

    entre autre ....
    Cela va dépendre aussi de ce qu'on te demande en particulier.

    Sinon pour le code en C, il y a feof qui teste si tu est arrivé en fin de fichier, fgets qui lit une ligne de fichier dans une chaine, strtok qui sépare une chaine en plusieurs partie suivant des délimiteurs.

  4. #4
    GECKO00

    Re : (language c) délimiteur

    Ca se voit tant que ca que je débute?? xd. En tous cas c'est PARFAIT, c'était exactement la fonction strtok() qu'il me fallait, elle fait tous à ma place ^_^. Comme tu l'a dit il faut encore que je fasse les vérification "anti-bug", mais pour ca j'essairais de me débrouiller. En tout cas merci infiniment pour ton aide, c'est sympa.

  5. A voir en vidéo sur Futura
  6. #5
    GECKO00

    Re : (language c) délimiteur

    J'aurais encore besoin de votre aide. Voila ce que je dois faire

    ---> http://www.lifl.fr/~marquet/cnl/pdc/tpmcu-002.html

    J'ai essayer de trouver des informations sur le "extern" via la net, mais je n'ai rien trouvé qui puisse m'aider , j'ai même crée une bibliothque et une libraire mais j'ai toujour l'erreur ---> error: implicit declaration of function ‘readl’.

    Pouvez vous m'aider?

  7. #6
    invite4492c379

    Re : (language c) délimiteur

    Bon, il faut que tu crées une bibliothèque nommée libreadl.

    Jette un coup d'oœil sur http://www.linux-france.org/article/memo/node103.html

  8. #7
    GECKO00

    Re : (language c) délimiteur

    je vais essayer
    Dernière modification par GECKO00 ; 06/10/2011 à 12h35.

  9. #8
    GECKO00

    Re : (language c) délimiteur

    Ca ne marche pas, quand je lance la compilation avec( gcc -I include -L lib -O mcut.c -o mcut -lmat) il me met---> warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result. Et quand je modifie mon code en mettant ligne =(ligne,200,fichier) ca compile mais après lorsque j'execute a chaque fois il me met: erreur de segmentation. En compilant avec (gcc -g -Wall -Werror -ansi -pedantic -o mcut mcut.c) et en enlevant l'appel a la fonction "externe" ca marche nickel

    voila le code qui fonctionne:

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

    int main(int argc, char *argv[])
    {


    FILE* fichier = NULL;
    FILE* fichiers = NULL;

    char* token;
    char* delim= argv[1];
    int compt= atoi(argv[2]);
    int i=0;

    char ligne[200];

    fichier = fopen("test.txt", "r");
    fichiers = fopen("test1.txt", "w");

    readl(ligne);

    fgets(ligne,200,fichier);
    while(compt>i)
    {
    i=i+1;
    if (i==1)
    {
    token=strtok(ligne,delim);
    }
    else {
    token=strtok(NULL,delim);
    }
    }

    fputs (token, fichiers);

    fclose(fichier);
    fclose(fichiers);

    return 0;
    }
    Dernière modification par GECKO00 ; 06/10/2011 à 12h50.

  10. #9
    invite4492c379

    Re : (language c) délimiteur

    Citation Envoyé par GECKO00 Voir le message
    Ca ne marche pas, quand je lance la compilation avec( gcc -I include -L lib -O mcut.c -o mcut -lmat) il me met---> warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result. Et quand je modifie mon code en mettant ligne =(ligne,200,fichier) ca compile mais après lorsque j'execute a chaque fois il me met: erreur de segmentation. En compilant avec (gcc -g -Wall -Werror -ansi -pedantic -o mcut mcut.c) et en enlevant l'appel a la fonction "externe" ca marche nickel

    voila le code qui fonctionne:
    (...)
    Un warning n'est pas une erreur ... fgets est déclarée généralement comme ceci :

    Code:
    char * fgets ( char * str, int num, FILE * stream );
    Si la fonction est exécutée esans erreur, la valeur de retour est str, sinon il envoie EOF.
    Ne pas assigner une variable avec la valeur de retour n'est pas grave en soi, même si vérifier que EOF n'est pas renvoyé fait partie de la gestion des erreurs ...

    Tu sais faire un makefile ?

    Il va falloir d'après le lien que tu as fourni, que tu crées un fichier readl.c avec un readl.h associé. Tu compiles ce fichier et tu crées une bibliothèque libreadl.a

    Indépendemment tu inclues le readl.h dans ton mcut.c et tu linkes le tout à la fin ton mcut.o et la lib readl.

  11. #10
    GECKO00

    Re : (language c) délimiteur

    Merci , entre-temp j'ai réussi à "résoudre" le probléme, j'ai toujour l'erreur du fgets mais en méttant le resultat dans une variable ca passe. Pour les erreurs de segmentations en modifant le fichier readl que j'avais fait ca a réglé le probléme. Sinon il est vrai que je ne sais pas du tout comment faire un makefile. On nous a donné ca comme base:


    CC = gcc
    CFLAGS = -Wall -Werror -ansi -pedantic
    CFLAGS += -g

    fact: fact.o fbib.o
    $(CC) $(CFLAGS) -o fact fact.o fbib.o
    fact.o: fact.c
    $(CC) -c $(CFLAGS) fact.c
    fbib.o: fbib.c
    $(CC) -c $(CFLAGS) fbib.c

    mais comment dois-je le modifier pour que tout s'execute sans probléme (avec ma libraire ect..)?

  12. #11
    MANTA..

    Re : (language c) délimiteur

    j'aimerais bien savoir comment faire un makefile svp

  13. #12
    invite4492c379

    Re : (language c) délimiteur

    Citation Envoyé par GECKO00 Voir le message
    Merci , entre-temp j'ai réussi à "résoudre" le probléme, j'ai toujour l'erreur du fgets mais en méttant le resultat dans une variable ca passe. Pour les erreurs de segmentations en modifant le fichier readl que j'avais fait ca a réglé le probléme. Sinon il est vrai que je ne sais pas du tout comment faire un makefile. On nous a donné ca comme base:
    Un warning n'est pas une erreur. Si tu as des warnings il faut bien évidemment les considérer mais tu peux décider de les accepter pour plusieurs raisons (entre autre ne pas se soucier de la valeur de retour de fgets car tu ne gères pas les erreurs ou tu gères la fin de fichier autrement ...). Tu auras tout un tas de warning surtout si tu utilises -Wall.
    La compilation n'échoue que s'il y a des erreurs.

    Citation Envoyé par GECKO00 Voir le message

    CC = gcc
    CFLAGS = -Wall -Werror -ansi -pedantic
    CFLAGS += -g
    Cette partie définit de variables. Attention aux espaces ...

    Citation Envoyé par GECKO00 Voir le message
    fact: fact.o fbib.o
    $(CC) $(CFLAGS) -o fact fact.o fbib.o
    fact.o: fact.c
    $(CC) -c $(CFLAGS) fact.c
    fbib.o: fbib.c
    $(CC) -c $(CFLAGS) fbib.c
    Cette partie comporte des règles d'inférences. Pour faire simple, tu énonces que tu dois reconstruire fact si fact.o ou fbib.o sont plus récent que fact. Si un des .o n'existe pas, make va cherche une règle pour le construire.

    Cela permet de ne reconstruire que ce qui est nécessaire. Si tu modifies fbib.c, make recompilera fbib.c en fbib.o, fact.o n'a pas besoin d'être recréé et il linkera fact.o et fbib.o en fact.

    Citation Envoyé par GECKO00 Voir le message
    mais comment dois-je le modifier pour que tout s'execute sans probléme (avec ma libraire ect..)?
    Une référence simple sur le makefile : ftp://ftp-developpez.com/gl/tutoriel/outil/makefile/Makefile.pdf
    Attention aux tabs ...

    Il y a deux types de bibliothèques, les statiques et les dynamiques.
    Il y a plusieurs références à ce sujet. Je te conseille de te faire la main sur les bibliothèques statiques dans un premier temps.
    En plus du premier lien (tu y trouves les commandes pour les créer, et donc quoi mettre dans le makefile) tu peux aussi jeter un coup d'œil sur :

    http://www.cmi.univ-mrs.fr/~contensi/coursC/index.php?section=env&page=bib
    http://www.trustonme.net/didactels/154.html

    Pour un exemple de makefile construisant une lib :
    http://www.digitalpeer.com/id/example

  14. #13
    whoami

    Re : (language c) délimiteur

    Bonjour,
    Citation Envoyé par photon57 Voir le message
    Un warning n'est pas une erreur
    Très mauvais conseil.

    Un code "propre" ne doit générer aucun warning, sinon c'est la porte ouverte aux problèmes.

  15. #14
    invite4492c379

    Re : (language c) délimiteur

    Même avec -Wall ?
    Note bien que je n'ai pas dit ignorer ...

  16. #15
    GECKO00

    Re : (language c) délimiteur

    Merci pour votre aide. J'ai un nouveau probléme sur lequel je but depuis plus d'une heure. Quand j'execute mon programme avec la fonction "externe" il me met une erreur de segmentation. Voila la fonction --->

    Code:
    #include <stdio.h>
    
     int VerifFichier(FILE* line)
    { 
     
      char c;
      int compt=0;
      int bool=0;
      
    
    while( fread(&c,1,1,line)>0 && bool!=1 ) {
    
        if(c=='\n') {
          compt=0;
        } else { 
          compt= compt+1;
        }
          
          
          if(compt>81)
          {
    	bool=1;
          }
    }
     	printf("%d", bool);
    	 return bool;
    
    
    
    }

    Et voila le début de mon code -->

    Code:
        
        FILE* fichier = NULL;
        FILE* fichiers = NULL;
        char* test;
        char* token;
        char* delim= argv[1];
        int compt= atoi(argv[2]);
        int i=0;
        int bool;
    
      char ligne[80];
    
        fichier = fopen("test.txt", "r");
        fichiers = fopen("test1.txt", "w");
    
    VerifFichier(fichier); c'est ca qui bloque, quand le fichier a plus de 80 caractére ca passe mais sinon ca bloque, je sais pas du tout pourquoi
    Dernière modification par GECKO00 ; 06/10/2011 à 15h21.

  17. #16
    GECKO00

    Re : (language c) délimiteur

    j'ai verifié, même quand la ligne est inférieur a 80 il met met erreur de ségmentation

  18. #17
    invite4492c379

    Re : (language c) délimiteur

    quels sont tes différents fichiers et comment les compiles-tu ? tu crées une lib ?

  19. #18
    GECKO00

    Re : (language c) délimiteur

    oui je fais éxactement comme dans ce lien --->http://www.linux-france.org/article/memo/node103.html

    je compile en faisant : gcc -I include -L lib -O mcut.c -o mcut -lmat

  20. #19
    GECKO00

    Re : (language c) délimiteur

    j'ai réussi à regler le probléme en changeant le paramétre de ma fonction "externe", a la place de mettre un FILE* j'ai juste mis un char*. Puis dans la fonction j'ai mis FILE* fichier=NULL et fichier = fopen(charRecupere, "r");

    Merci pour tout

  21. #20
    GECKO00

    Re : (language c) délimiteur

    Je n'arrive pas a faire mon makefile. Voila ce que je fait pour compiler:

    gcc -c conformF.c (conformF étant le fichier contenant la descritpion des fonctions externes)
    ar r libmat.a conformF.o
    ranlib libmat.a

    Ensuite pour compiler je fais : gcc -I include -L lib -O mcut.c -o mcut -lmat (mcut étant le fichier à compiler)

    Je sais qu'un makefile sert à executer "automatiquement" un programme mais je n'arrive pas du tout à l'ecrire, surtout que mon programme utilise une fonction définit dans une librairie.....

    Voici mon prototype basé sur ce que j'ai dit precedemment --------6>


    CC = gcc
    CFLAGS = -c
    CFLAGS += -g
    comp= ar r
    CFLAGS3= ranlib
    CFLAGS4= -I include -L lib -O
    CFLAGS5= -o
    CFLAGS6= -lmat
    gcc -I include -L lib -O mcut.c -o mcut -lmat


    mct: fact.o fbib.o
    $(CC) $(CFLAGS) mcut.c

    $(CFLAGS2) libmat.a conformF.o

    $(CFLAGS3) libmat.a


    $(CC)$(CFLAGS4) mcut.c $(CFLAGS5) mcut $(CFLAGS6)



    .PHONY: clean realclean
    clean:
    $(RM) $(OBJ)
    realclean : clean
    $(RM) fact

  22. #21
    invite4492c379

    Re : (language c) délimiteur

    Attention la syntaxe du makefile est très particulière

    fichier cible : dépendances du fichier cible
    <TAB>commande 1
    <TAB>commande 2
    <TAB> ...
    <TAB>commande n
    <ENTER>

    fichier cible : ...


    où la liste des commandes est ce que tu taperais normalement pour créer le fichier cible.
    Une ligne qui commence par $(CFLAGS) est faux car il ne s'agit pas d'une commande.

  23. #22
    GECKO00

    Re : (language c) délimiteur

    Voici un autre prototype en 2 makefile

    fichier Makefile -->
    Code:
    NAME= libmat
    SRC= conformF.c
    OBJ= $(SRC:.c=.o)
    CC= gcc
    CFLAGS= -g
    
          $(NAME): $(OBJ)
          $(CC) $(OBJ) -o $(NAME).a
          ar r $(NAME).a $(OBJ)
          ranlib $(NAME).a
    fichier Makefile2 -->
    Code:
    NAME= mcut
    SRC= mcut.c
    OBJ= $(SRC:.c=.o)
    CC= gcc
    CFLAGS= -g
    $(NAME): $(OBJ)
    
           LDFLAGS= -I include -L lib -lmath
           $(CC) $(OBJ) -o $(NAME) $(LDFLAGS)
    Dernière modification par GECKO00 ; 07/10/2011 à 08h34.

  24. #23
    invite4492c379

    Re : (language c) délimiteur

    Hello,

    Si les fichiers contiennent exactement ce qui est à l'écran ça ne fonctionnera pas. Pour le premier makefile tu as un tab avant le nom de la cible. Quant au second, tu as une ligne blanche entre la règle et les commandes.
    Pourquoi avoir fait deux makefile ?

  25. #24
    GECKO00

    Re : (language c) délimiteur

    ca y'est j'ai montré mon code a mon prof et il ma montré comment faire, en fait y'avait pas besoin de faire une librairie c'était beaucoup plus simple que ca. Merci pour votre aide

  26. #25
    invite4492c379

    Re : (language c) délimiteur

    Mais de rien
    C'est ton énoncé qui imposait des bibliothèques.

Discussions similaires

  1. Compilation Language C en Language Hex pour PIC16F877
    Par bibi_6919 dans le forum Électronique
    Réponses: 8
    Dernier message: 19/09/2011, 17h43
  2. language c
    Par invite31370605 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 04/12/2008, 21h44
  3. language C
    Par invitefa544961 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 22/07/2008, 09h10
  4. language C
    Par invite00b08343 dans le forum Logiciel - Software - Open Source
    Réponses: 13
    Dernier message: 02/09/2006, 17h03
  5. Language
    Par invite6cd67d9b dans le forum Électronique
    Réponses: 10
    Dernier message: 11/07/2003, 13h26