Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1559 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Premier programme C (manip. de fichiers txt)

n°1748372
Elmoricq
Modérateur
Posté le 18-06-2008 à 16:44:02  profilanswer
 

Reprise du message précédent :
En ce cas, je ne saurais trop te conseiller de te procurer un bon livre, ça sert toujours et ça simplifie grandement la tache.
Je suggère "Le Langage C" de Kernighan & Ritchie.

mood
Publicité
Posté le 18-06-2008 à 16:44:02  profilanswer
 

n°1748718
a_goodspee​d
Posté le 19-06-2008 à 09:51:30  profilanswer
 

Alors là, je butte sur un nouveau pb:
Est-ce qu'il serait possible de faire quelque chose com ca:


                      ___ ___ ___  
ListeNoms (tableau) : | 1|| 2|| 3|  
                      ''|'''|'''|'
                      Nom1  |   |  
                          Nom2  |  
                             Nom3  


 
Autrement dit la valeur 1 du tableau ListeNoms vaut : la chaine contenue dans le poniteur "Nom1"
 
J'ai essayé, mais je bloque!

Code :
  1. typedef char chaine[20];
  2. int main(int argc, char *argv[])
  3. {
  4.     char listeNoms[2] = {0};
  5.    
  6.     char nom1[] = "julien";
  7.     char nom2[] = "Popol";
  8.    
  9.     chaine *Pnom1 = &nom1;
  10.     listeNoms[1] = **Pnom1;
  11.     printf("%s", listeNoms);
  12.    
  13. system("PAUSE" );
  14.     return 0;  }


 
Et sinon, je voudrais savoir s'il est possible, lors d'une boucle, de créer des valeursdont le nom dépend du n° de l'incrément.
Je m'explique:
 
NomParam_i = Valeur calculée
 
Pour récupérer quelque chose comme:
 
NomParam_1 = 15
NomParam_2 = 164
NomParam_3 = 516
 
Si c'est possible, avec quelle commande?


Message édité par a_goodspeed le 19-06-2008 à 09:54:12
n°1748731
Elmoricq
Modérateur
Posté le 19-06-2008 à 10:07:06  profilanswer
 

C'est possible de faire des listes/tableaux.
Lis cet article, cela devrait t'éclairer :
Les pointeurs démythifiés (jusqu'au morceau "char **" )
Puis :
Créer un tableau à 2 dimensions
 
 
Pour la seconde partie de ton post, non ce n'est pas possible. Mais puisque l'on peut utiliser des tableaux, ce que tu demandes n'a pas d'intérêt.

n°1748753
a_goodspee​d
Posté le 19-06-2008 à 10:25:51  profilanswer
 

Ok Merci beaucoup je vais jetter un oeil.
 
En fait je voudrais faire ca pour que le progamme récupere certains mots en mémoire (MAT1_1, MAT2_2, MAT1_10034...) pour ensuite les proposer à l'utilisateur qui en choisira 1 afin de s'en servir pour la suite... Tordu, non?
 
 
Nouveau probleme:
 

Code :
  1. typedef char chaine[13];
  2. int main(int argc, char *argv[])
  3. {
  4.     long nbMat = 35;
  5.     long tailleListeMat = 0;
  6.     tailleListeMat = nbMat*13;
  7.     char listeMat[tailleListeMat], i = 0;
  8.    
  9.     for (i = 0 ; i < tailleListeMat ; i++)
  10.     {
  11.         listeMat[i] = 'a';
  12.         }
  13. printf("%s\n", listeMat);
  14. system("PAUSE" );
  15. return 0;
  16. }


 
Ca ne m'affiche rien du tout!! Meme pas le "appuyez sur un touche pour continuer
Alors que si je met :   tailleListeMat = nbMat*2,
Ca m'affiche bien mes 70 'a'...
 
Je sais, ca ne sert a rien à l'etat actuel, mais je test...
Quelqu'un peut m'expliquer svp?


Message édité par a_goodspeed le 19-06-2008 à 10:50:53
n°1748780
a_goodspee​d
Posté le 19-06-2008 à 11:00:56  profilanswer
 

J'ai trouvé!! ca ne marche plus dès que j'atteinds 127 pour la taille du tabeau.  
Mais je comprends pas parceque j'ai pas de 'int' je demande des char!!!

n°1748786
skeye
Posté le 19-06-2008 à 11:10:22  profilanswer
 

a_goodspeed a écrit :

J'ai trouvé!! ca ne marche plus dès que j'atteinds 127 pour la taille du tabeau.  
Mais je comprends pas parceque j'ai pas de 'int' je demande des char!!!


 
Au hasard, c'est normal que ton indice "i" soit de type char?[:petrus dei]


---------------
Can't buy what I want because it's free -
n°1748792
a_goodspee​d
Posté le 19-06-2008 à 11:14:40  profilanswer
 

skeye a écrit :


 
Au hasard, c'est normal que ton indice "i" soit de type char?[:petrus dei]


 
 :whistle: Oupssssssss!!!
Heureusement qu'il y en a qui ont l'oeuil... mais c'est vrai que je n'aurais jamais pensé à ca...
Merci bcp

n°1748895
a_goodspee​d
Posté le 19-06-2008 à 14:51:12  profilanswer
 

Encore une 'tite question... quand je suis entrain de lire un fichier complet (avec une boucle while), je récupere une ligne précise (avec if et un strstr). Est ce qu'il existe un commande pour lire la ligne suivante (toujours dans le "if" ) avant de continuer la boucle?

n°1748896
skeye
Posté le 19-06-2008 à 14:52:19  profilanswer
 

[:roane]


---------------
Can't buy what I want because it's free -
n°1748911
Elmoricq
Modérateur
Posté le 19-06-2008 à 15:20:36  profilanswer
 

Sans méchanceté, il te faut vraiment un bouquin ou un cours de C.
 
Quoi qu'il en soit, quand tu fais une lecture dans un fichier, le curseur avance d'autant de données que tu as lues.
Donc si tu lis une ligne dans un fichier, la prochaine ligne que tu liras sera la suivante, et ainsi de suite jusqu'à la fin du fichier.

mood
Publicité
Posté le 19-06-2008 à 15:20:36  profilanswer
 

n°1748963
a_goodspee​d
Posté le 19-06-2008 à 16:14:05  profilanswer
 

edit:
 
Je veux  récupérer un matériau acec un mon bien précis (MAT1_100XX) (il y en a qu'un seul de ce type par fichier)
Alors voilà, j'ai pas mal avancé:
 

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define TAILLE_MAX 50
  5. typedef char mot[20];
  6. /////////////////////////////////////////////////////////
  7. char* NOMMATERIAU(mot NomFichier)  ;
  8. int main(int argc, char *argv[])
  9.    { mot NomFichier;
  10.     printf("Entrer le nom complet du fichier a modifier:   " );
  11.     scanf("%s",&NomFichier);
  12.     printf("Vous allez modifier le fichier :   %s \n\n", NomFichier);
  13.                 char *b;
  14.                 b = NOMMATERIAU(NomFichier);
  15.                 printf("%s\n", b);   
  16.                 system("PAUSE" );
  17. return 0;
  18. }
  19. //////////////////////////////////////////////////////////
  20.     char* NOMMATERIAU(mot NomFichier)
  21.     {
  22.     FILE *fichier = NULL;
  23.     char chaine[TAILLE_MAX] = "";
  24.     char *compareMat="";
  25.     char *nomMat[1];
  26.     fichier = fopen(NomFichier, "r+" );
  27.     if (fichier != NULL)
  28.  
  29.         while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
  30.         {
  31.         compareMat = strstr(chaine, "*MATERIAL" );
  32.              
  33.         if (compareMat != NULL)
  34.         {
  35.                     nomMat[0] = strstr(chaine, "MAT1_100" );
  36.                                          
  37.                     printf("%s\n",nomMat[0]);   
  38.                     system("PAUSE" );
  39.                     nomMat[0]; 
  40.           }
  41.           } return nomMat[0];                     
  42.    fclose(fichier);
  43. }


Je pensais avoir compris ces histoires de tableau, et pointeurs, mais apparemment il y a quelque chose qui m'échape!!
J'ai bien relu le cours sur : http://www.siteduzero.com/tuto-3-8 [...] -en-c.html
Mais tj est-il lors du 1er printf, ca m'affiche bien:           MAT1_10035
Mais le return renvoi au main quelquechose comme:        ùG
J'ai beau relire le cours et essayer de tourner le pb dans tous les sens, je ne trouve pas où ca foire...
(Je voudrais au final : que "b" aie pour valeur "MAT1_10035" )


Message édité par a_goodspeed le 20-06-2008 à 14:54:27
n°1749381
a_goodspee​d
Posté le 20-06-2008 à 14:50:23  profilanswer
 

:cry:  :cry: Pourquoica marche pa???!!!
Alors que quand j'essaie avec ca, ca marxche nikel!!!

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define TAILLE_MAX 50
  5. typedef char mot[20];
  6. /////////////////////////////////////////////////////////
  7. char* NOMMATERIAU(mot NomFichier)  ;
  8. int main(int argc, char *argv[])
  9.    { mot NomFichier;
  10.     printf("Entrer le nom complet du fichier a modifier:   " );
  11.     scanf("%s",&NomFichier);
  12.     printf("Vous allez modifier le fichier :   %s \n\n", NomFichier);
  13.                 char *b;
  14.                 b = NOMMATERIAU(NomFichier);
  15.                 printf("%s\n", b);   
  16.                 system("PAUSE" );
  17. return 0;
  18. }
  19. //////////////////////////////////////////////////////////
  20. char* NOMMATERIAU(mot NomFichier)
  21.     {
  22.         char *nomMat[1];
  23.         nomMat[0] = "julien";
  24.         printf("%s\n", nomMat[0]);
  25.         system("PAUSE" );
  26.         return nomMat[0]; 
  27. }


Message édité par a_goodspeed le 20-06-2008 à 14:53:46
n°1749410
tpierron
Posté le 20-06-2008 à 15:48:04  profilanswer
 

Oué, on n'a pas encore fini, si tu tombes dans tous les pièges ultra classiques du C.
 
En l'occurence tout premier programme retourne n'importe quoi, parce que tu retournes une variable (en fait un tableau) locale à la fonction. La valeur de cette variable n'est garantie que dans la fonction où cette variable est définie. Dans ton deuxième programme la chaine est statique (donc pas allouée sur la pile), ce qui fait que tu peux la retourner à la fonction appelante.
 

n°1749431
a_goodspee​d
Posté le 20-06-2008 à 16:24:08  profilanswer
 

Ben oui.. je suis encore tombé ds un piege...  :whistle: et je pensais bien que c'était à cause de la boucle!!
Le problème c'est qu'en relisant tous les tuto que je peu truover, jne trouve pas de solution.

n°1749439
Elmoricq
Modérateur
Posté le 20-06-2008 à 16:34:29  profilanswer
 

As-tu lu le contenu du site que j'ai cité plus haut ?
Et évite le site du zéro, je serais toi je ne ferais pas confiance à un tutorial qui préconise l'utilisation de la fonction scanf()...

n°1749444
tpierron
Posté le 20-06-2008 à 16:43:11  profilanswer
 

Bah, passe le buffer en paramètre à ta fonction (avec la taille pour éviter les buffer overflow) et recopie ta chaine dans ce buffer plutôt que de la retourner à la fonction appelante.

n°1750094
a_goodspee​d
Posté le 23-06-2008 à 10:34:40  profilanswer
 

Merci pour vos conseils!
J'ai trouvé la solution! :D  
Alors je ne sais pas si c'est comme ca que vous me disiez de faire, mais ca marche!
 

Code :
  1. char* NOMMATERIAU(mot NomFichier)
  2.     {
  3.     FILE *fichier = NULL;
  4.     char chaine[TAILLE_MAX] = "";
  5.     char *compareMat="";
  6.     char *nomMat;
  7.     char Materiau[12];
  8.     int i=0;
  9.     fichier = fopen(NomFichier, "r+" );
  10.     if (fichier != NULL)
  11.  
  12.         while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
  13.         {
  14.         compareMat = strstr(chaine, "*MATERIAL" );
  15.              
  16.         if (compareMat != NULL)
  17.         {
  18.                     nomMat = strstr(chaine, "MAT1_100" );
  19.              
  20.                             if (nomMat != NULL)
  21.                               {
  22.                               for (i = 0 ; i < 11 ; i++)
  23.                                   {
  24.                                   Materiau[i] = nomMat[i];
  25.                                   }
  26.                               system("PAUSE" ); 
  27.                               }
  28.           }   
  29.           } return Materiau;                   
  30.    fclose(fichier);
  31. }


 
J'ai bien réfléchi, je me suis dessiné un petit schema des tableaux et pointeurs... et j'en ai déduit cette  nouvelle version!
Je sais pas si c'était la meilleur solution, mais l'essentiel est que ca marche!

n°1750323
tpierron
Posté le 23-06-2008 à 17:43:42  profilanswer
 

Euh, je vois encore des (gros) problèmes avec ton code :

  • Tu retournes toujours un tableau local.
  • Ton "return" se trouve avant ton fclose().  :sweat:  
  • Ta chaine "Materiau" n'est pas forcément terminée par 0. C'est pas forcément un problème, mais en général vaut mieux être prudent.

n°1751515
a_goodspee​d
Posté le 26-06-2008 à 08:51:06  profilanswer
 

:Merci. oui, en effet, j'avais pas fait attention au 'return' avant le 'fcolse'. C'est corrigé!!! J'ai aussi fait pas mal d'autres modifsdans mon prog... (ca commence à rentrer :) )
 
Mais là je bloque sur un nouveau point...
comme je l'ai expliqué plus tot, il faut que je supprime certain mots du texte
Par exemple:
 

*SHELL GENERAL SECTION, ELSET = PSHELL_36, MATERIAL = MAT1_10


devient:

*SHELL SECTION, ELSET = PSHELL_36, MATERIAL = MAT1_10


Ca, j'ai réussi sans probème (je récupère une chaine de 8 caractères (*SHELL) et ensuite la fin de la ligne commencant par "SECTION"
 
Par contre, pour le cas suivant:

*SOLID SECTION, ELSET=PSOLID_35, ORIENTATION = , MATERIAL=MAT1_9


doit devenir:

*SOLID SECTION, ELSET=PSOLID_35, MATERIAL=MAT1_9


 
L'ennui, cest que je ne peux pas utiliser la meme technique parceque la phrase de base peut aussi etre ecrit:

*SOLID SECTION, ELSET=renfort_charniere, ORIENTATION = , MATERIAL=MAT1_9


Donc le nombre de caracteres de la prmiere partie à récupérer peut varier.
 
Est-t-il possible de lire une chaine jusqu'à un séparateur (une virgule)? Avec quelle commande? Ca serait une possibilité.
Ou sinon peut-on lui dire di lire JUSQU'A un caractere donné?
Sinon, quelqu'un aurait une autre idée?


Message édité par a_goodspeed le 26-06-2008 à 08:54:04
n°1751671
a_goodspee​d
Posté le 26-06-2008 à 11:21:39  profilanswer
 

!!!J'ai trouvé la solution!!!!
 
Pour ceux que ca intéresse:

Code :
  1. fichierTmp=fopen("fichier_temporaire.inp", "w+" );
  2. fichier = fopen("fichier_init.inp", "r+" );
  3. char solid[50] = "";
  4.      compare="";
  5.      compare2="";   
  6.      compare3="";   
  7.      i = 0;
  8. long longueurChaine = 0;
  9. long longueurChaine2 = 0;
  10. long longueurChaine1 = 0;
  11.         while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
  12.               {
  13.               compare = strstr(chaine, "*SOLID SECTION" );
  14.              
  15.               if (compare != NULL)
  16.                  {
  17.                           longueurChaine = strlen(chaine);
  18.                           compare2 =strstr(chaine, "MAT" );
  19.                           compare3 =strstr(chaine, "ORIENTATION = ," );
  20.                                    if (compare2 != NULL && compare3 != NULL)
  21.                                         {                 
  22.                                         longueurChaine2 = strlen(compare2);
  23.                                         longueurChaine1 = longueurChaine - longueurChaine2 - 16;                 
  24.                                         for (i = 0 ; i < longueurChaine1 ; i++)
  25.                                             {
  26.                                                    solid[i] = compare[i];
  27.                                             }
  28.                                         fprintf(fichierTmp, solid);
  29.                                         fprintf(fichierTmp, compare2);
  30.                                         }
  31.                                    else
  32.                                         {                       
  33.                                         fprintf(fichierTmp, chaine);
  34.                                         }                                         
  35.                   }
  36.               else
  37.                   {                       
  38.                              fprintf(fichierTmp, chaine);
  39.                   }                               
  40.               }           
  41. fclose(fichier);
  42. fclose(fichierTmp);

n°1753964
a_goodspee​d
Posté le 01-07-2008 à 13:56:24  profilanswer
 

Wahouuuuuuuuuuuuuuuuu!!! :bounce:  :D  :D  :bounce:  
Ca y est, j'ai terminé mon premier programme en C..!!!
Ca marche nikel maintenant!
 
Bon je pourrais surement optimiser un peu mais je viens de me casser le c** pendant pas mal de temps pour écrire à peu pres 1300 ligne (je vous rassure, dans plusieurs fichiers...), alors pour le moment, je laisse comme ca!
 
Merci à tous pour votre aide.


Message édité par a_goodspeed le 01-07-2008 à 13:56:54
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Exécution d'une macro sans ouvrir les fichiers ExcelProgramme VBA qui insere un nom de colonne
[RESOLU] extraire et afficher premier caractere de chaque chaine[AIDE] bug mon projet C
un Switch réparti sur plusieurs fichiers ?Les fichiers : lecture, écriture (help)
Comment imprimer les fichiers html d'un forum?un mini projet en C (j ai besoin d aide)
[résolu]Classes pour faciliter l'utilisation de sockets C, en C++[OPENGL SFML C++] Probléme executable.
Plus de sujets relatifs à : Premier programme C (manip. de fichiers txt)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR