Premier programme C (manip. de fichiers txt)

Premier programme C (manip. de fichiers txt) - C - Programmation

Marsh Posté le 17-06-2008 à 10:09:44    

Voilà mon probleme:
J'essaie de faire un petit programe pour faire des modif automatiques dans un fichier de calculs.  
 
Voilà à quoi ressemble mon code (pour linstant):
 
 
Mon main.c

Code :
  1. #include <cstdlib>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <iostream>
  5. #define TAILLE_MAX 100
  6. #include <math.h>
  7. #include "compteur.h"
  8. using namespace std;
  9. int main(int argc, char *argv[])
  10. {
  11. int nbShell = 0;
  12.     nbShell = COMPTEURSHELL(); // Recupere la valeur ds compteurSHELL.c
  13.     printf ("\n %ld 'SHELL GENERAL SECTION' presents \n", nbShell);
  14. int nbOrient = 0;
  15.     nbOrient = COMPTEURORIENT(); // Recupere la valeur ds compteurORIENT.c
  16.     printf ("\n %ld 'ORIENTATION' inutiles presents pour les elements 'SOLID'\n", nbOrient);
  17.     system("PAUSE" );
  18.     return 0;
  19. }


 
Mon compteurSHELL.c (quasiment identique au compteurORIENT.c)
 

Code :
  1. #include <cstdlib>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <iostream>
  5. #define TAILLE_MAX 100
  6. #include <math.h>
  7. ////////////////////////////////////////////////////////////////////////////////////////
  8. /* CETTE FONCTION COMPTE LE NOMBRE DE "SHELL GENERAL SECTION" PRESENTS DANS LE FICHIER*/
  9. ////////////////////////////////////////////////////////////////////////////////////////
  10. using namespace std;
  11.     int COMPTEURSHELL()
  12.     {
  13.     FILE* fichier = NULL;
  14.     char chaine[TAILLE_MAX] = "";
  15.     int  CompteurSHELL=0;
  16.     char *compare="";
  17.    
  18.     fichier = fopen("X73sortie_HM.inp", "r+" );
  19.     if (fichier != NULL)
  20.    {
  21.         while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
  22.         {
  23.         compare = strstr(chaine, "SHELL GENERAL SECTION" );
  24.        
  25.         if (compare != NULL)
  26.         {
  27.         CompteurSHELL++;
  28.         }
  29.         }
  30.         fclose(fichier);
  31.      return CompteurSHELL;   } 
  32. }


 
Et mon compteur.h (composites des compteurSHELL et compteurORIENT)
 

Code :
  1. #include <cstdlib>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <iostream>
  5. #define TAILLE_MAX 100
  6. #include <math.h>
  7. int COMPTEURSHELL();
  8. int COMPTEURORIENT();


 
 
Jusque là, tout va bien, mais je n'arrive pas à creer une fonction pour demander d'entrer ,dans la console, le nom du fichier à modifier.
Pour l'instant, le fichier est ouvert puis fermé à chaque étape "compteurSHELL" et "compteurORIENT". Je voudrais donc qu'il soit ouvert au début du "main" puis fermé à la fin...
Quelqu'un pourraît m'aider??
 
Merci d'avance.


Message édité par a_goodspeed le 26-06-2008 à 11:12:20
Reply

Marsh Posté le 17-06-2008 à 10:09:44   

Reply

Marsh Posté le 17-06-2008 à 10:11:37    

je ne ferai pas de commentaires sur le code pour l'instant, mais quelle est ta question?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2008 à 10:18:01    

skeye a écrit :

je ne ferai pas de commentaires sur le code pour l'instant, mais quelle est ta question?


 
Dsl j'avais pas fini d'éditer mon message!! ;)

Reply

Marsh Posté le 17-06-2008 à 10:20:39    

Première question naïve : c'est censé être du C ou du C++?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2008 à 10:22:01    

skeye a écrit :

Première question naïve : c'est censé être du C ou du C++?


 
Euuuuh..... ben du C

Reply

Marsh Posté le 17-06-2008 à 10:29:22    

int nbShell = 0;
    nbShell = COMPTEURSHELL();
 
C'est quoi l'utilité d'initialiser ton int à 0 si c'est pour changer sa valeur à la ligne d'après?

Reply

Marsh Posté le 17-06-2008 à 10:29:32    

#include <iostream> et using namespace std; c'est du C++, pas du C. Et de toute manière tu ne t'en sers pas.
Plus généralement tes #include c'est un peu beaucoup le bordel, là...

 

Ensuite pour répondre un peu plus précisément à ta question, il y a plusieurs choses :
1) Faire saisir le nom du fichier dans le main.
2) Ouvrir le fichier dans le main.
3) Passer en paramètre le FILE* à tes fonctions.

 

Pas de réelle difficulté là a priori...


Message édité par skeye le 17-06-2008 à 10:29:57

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-06-2008 à 10:36:16    

Effectivement : soit tu enlèves iostream, using namespace et tout le toutim, soit je déplace ce sujet dans la catégorie C++ [:dawao]

Reply

Marsh Posté le 17-06-2008 à 10:45:39    

oui en fait je suis sur Dev C++ et ca m'a mis en C++ par défaut, j'ai supprimé les truc en trop... et la je suis bien en C
 
Sinon, j'ai bien essayé, mais je bloqe un peu...
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     char NomDuFichier[100];
  4.     printf("Entrer le nom du fichier a modifier: " );
  5.     scanf("%s", NomDuFichier);


 
Ca, c'est assez simple, mais c'est apres, pour passer en paramètre FILE* que j'ai un peu de mal!!

Reply

Marsh Posté le 17-06-2008 à 10:48:05    

fopen

Reply

Marsh Posté le 17-06-2008 à 10:48:05   

Reply

Marsh Posté le 17-06-2008 à 10:55:35    

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     char NomDuFichier[100];
  4.     FILE* fichier = NULL;
  5.     printf("Entrer le nom du fichier a modifier: " );
  6.     scanf("%s", NomDuFichier);
  7.    
  8.     fichier = fopen(NomDuFichier, "r+" );


 
Je pense qu'il manque quelquechose dans le compteurORIENT.c et compteurSHELL.c:
 

Code :
  1. if (fichier != NULL)
  2.    {
  3.         while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
  4.         {//suite se la commande..


 
Message d'erreur:
 
`fichier' undeclared (first use in this function)  
 

Reply

Marsh Posté le 17-06-2008 à 11:10:35    

À voir t'as pas défini "fichier" alors que tu tentes de l'utiliser

Reply

Marsh Posté le 17-06-2008 à 11:13:17    

Ben... il est défini dans le main, et c'est justement ca mon problème!!! Je suis bloqué à ce niveau précis...

Reply

Marsh Posté le 17-06-2008 à 11:15:53    

Oui s'accord.. Mais tu l'appelles ou? Parce que si t'es pas dans le même scope, y a pas de miracles .. il va pas le trouver .. hein?

Reply

Marsh Posté le 17-06-2008 à 11:25:57    

je récapitule là où j'en suis exactement
 
Main:

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #define TAILLE_MAX 100
  4. #include "compteurs.h" */ la c'est pour récupérer les composites de mes compteurs
  5.                                   "compeurSHELL" et "comteurORIENT"
  6. int main(int argc, char *argv[])
  7. {
  8.     char NomDuFichier[100];
  9.     FILE* fichier = NULL;
  10.     printf("Entrer le nom du fichier a modifier: " );
  11.     scanf("%s", NomDuFichier);
  12.    
  13.     fichier = fopen(NomDuFichier, "r+" ); // Là je lui demande d'ouvrir un fichier dont on a donné le nom
  14. //--------------------------------------------------------------------------
  15. int nbShell = 0;
  16.     nbShell = COMPTEURSHELL(); // Recupere la valeur ds compteurSHELL.c
  17.     printf ("\n %ld 'SHELL GENERAL SECTION' presents \n", nbShell);
  18. //--------------------------------------------------------------------------
  19. int nbOrient = 0;
  20.     nbOrient = COMPTEURORIENT(); // Recupere la valeur ds compteurORIENT.c
  21.     printf ("\n %ld 'ORIENTATION' inutiles presents pour les elements 'SOLID'\n", nbOrient);
  22. //--------------------------------------------------------------------------
  23.     system("PAUSE" );
  24.     fclose(fichier);
  25.     return 0;
  26. }


 
Mon "compteurSHELL.c" (qausi identique à "compteurORIENT.c" )

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #define TAILLE_MAX 100
  4. #include <math.h>
  5.     int COMPTEURORIENT()
  6.     {
  7.     char chaine[TAILLE_MAX] = "";
  8.     int  CompteurORIENT=0;
  9.     char *compare="";
  10.     if (fichier != NULL)
  11.    {
  12.         while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
  13.         {
  14.         compare = strstr(chaine, " ORIENTATION = ," );
  15.        
  16.         if (compare != NULL)
  17.         {
  18.         CompteurORIENT++;
  19.         }
  20.         }
  21.      return CompteurORIENT;   } 
  22. }


 
Et mon header compteurs.h

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #define TAILLE_MAX 100
  4. #include <math.h>
  5. int COMPTEURSHELL();
  6. int COMPTEURORIENT();


 
Je ne sais pas où mettre quoi pour que ca marche!


Message édité par a_goodspeed le 17-06-2008 à 11:26:44
Reply

Marsh Posté le 17-06-2008 à 11:45:58    

Ta variable "fichier" n'existe que dans la fonction main(), pas au-delà.
 
Le plus simple dans ton cas est d'ajouter un paramètre FILE* à ta fonction COMPTEURORIENT(), que tu utiliseras dedans.

Reply

Marsh Posté le 17-06-2008 à 12:32:10    

Merci.. mais j'ai beau essayer, j'y arrive tj pas... quelque pourrait me montrer sur mon prog ce qu'il manque pour que ca aille bien? C'est peut etre tres simple, mas je suis perdu!!

Reply

Marsh Posté le 17-06-2008 à 12:56:47    

Bon ...
 

Code :
  1. void maFonction(){
  2. int a = 0;
  3. // Ici int a est défini
  4. }
  5. void monAutreFonction(){
  6. //Ici int a n'est plus défini car on a changé de fonction (= et donc de scope)
  7. }
  8. void reFonction(int a)
  9. {
  10. // Ici int a est à nouveau défini car je le lui passe comme paramètre.
  11. }


 
Compris?


Message édité par esox_ch le 17-06-2008 à 12:57:57

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 17-06-2008 à 13:06:06    

Oui, ca j'ai bein compris...
Ce que je n'ai pas compris, c'est comment (dans mon cas) dire à mes fonctions "int COMPTEURSHELL()" et "int COMPTEURORIENT()" de travailler sur le fichier ouvert dans le main, et dont le nom de la variable est "NomDuFichier".


Message édité par a_goodspeed le 17-06-2008 à 13:07:11
Reply

Marsh Posté le 17-06-2008 à 13:24:26    

Tu le fais exprès? C'est peut-être pas ce que fait la fonction reFonction dans mon exemple? Travailler sur un entier défini dans une autre fonction?

Reply

Marsh Posté le 17-06-2008 à 16:38:02    

En fait, j'ai beau essayer, il doit y avoir une histoire de pointeurs par rapport à mon nom de fichier (le parametre "fichier" )...
 
Donc, pour mieux comprendre, je suis reparti sur des bases plus saines...
 
Du coup, je demande le nom du fichier que je garde comme parametre d'entrée pour les fonctions "compteur".
La seule différence avec ce que je voulais faire c'est que le fichier s'ouvre et se ferme toujours pour chaque fonction..
Mais ca marche!!  :)  
 
 
Mon main:

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #define TAILLE_MAX 100
  4. #include <math.h>
  5. typedef char mot[100];
  6. //--------------------------------------------------------------------------------------------------//
  7. //                                       DEBUT DU MAIN                                              //                 
  8. //--------------------------------------------------------------------------------------------------//  
  9.    
  10. int main(int argc, char *argv[])
  11. {
  12. //----------------------------On récupère le nom du fichier à miodifier-------------------------------
  13.    
  14.     mot NomFichier;
  15.     printf("Entrer le nom complet du fichier a modifier:" );
  16.     scanf("%s",&NomFichier);
  17.     printf("Vous allez modifier le fichier :%s ", NomFichier);
  18. //---------------------On lance la fonction COMPTEURSHELL et on récupère la valeur---------------------
  19. int nbShell = 0;
  20.     nbShell = COMPTEURSHELL(NomFichier);
  21.     printf ("\n %ld 'SHELL GENERAL SECTION' presents \n", nbShell);
  22. //    system("PAUSE" );
  23. //    return 0;}
  24. //---------------------On lance la fonction COMPTEURORIENT et on récupère la valeur----------------------
  25. int nbOrient = 0;
  26.     nbOrient = COMPTEURORIENT(NomFichier);
  27.     printf ("\n %ld 'ORIENTATION' inutiles presents pour les elements 'SOLID'\n", nbOrient);
  28. //----------------------------------------------------------------------------------------------------
  29.     system("PAUSE" );
  30.     return 0;}


 
Mon (mes) compteur:

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #define TAILLE_MAX 100
  4. #include <math.h>
  5. ////////////////////////////////////////////////////////////////////////////////////////
  6. /* CETTE FONCTION COMPTE LE NOMBRE DE "SHELL GENERAL SECTION" PRESENTS DANS LE FICHIER*/
  7. ////////////////////////////////////////////////////////////////////////////////////////
  8.     typedef char mot[100];
  9.     int COMPTEURSHELL(mot NomFichier)
  10.     {
  11.     FILE *fichier = NULL;
  12.     char chaine[TAILLE_MAX] = "";
  13.     int  CompteurSHELL=0;
  14.     char *compare="";
  15.    
  16.     fichier = fopen(NomFichier, "r+" );
  17.     if (fichier != NULL)
  18.    {
  19.         while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
  20.         {
  21.         compare = strstr(chaine, "SHELL GENERAL SECTION" );
  22.        
  23.         if (compare != NULL)
  24.         {
  25.         CompteurSHELL++;
  26.         }
  27.         }
  28.         fclose(fichier);
  29.      return CompteurSHELL;   }  }


Message édité par a_goodspeed le 17-06-2008 à 16:40:09
Reply

Marsh Posté le 17-06-2008 à 16:41:15    

Un peu de documentation pour t'aider :
 
- Quelques fondamentaux : http://mapage.noos.fr/emdel/init_c.htm
 
- Pourquoi ma fonction ne modifie pas ma variable ?
 
- Gestion de fichiers en C
 
Cela devrait t'aider.

Reply

Marsh Posté le 17-06-2008 à 17:04:48    

Merci bien... j'ai encore un peu de lecture devant moi!!!!
j'espere pouvoir continuer sans trop d'embuches... le plus dur reste à venir!

Reply

Marsh Posté le 18-06-2008 à 10:05:14    

Alors voilà la suite de mon problème:
Comme précisé dans mon premier post, le but de mon programme serait de faire des modifs dans un fichier (fichier input pour simulation numérique).  
Les modifications seraient du genre: à cahque fois que le prog. trouve "SHELL GENERAL SECTION" dans le doc, il le remplace par "SHELL SECTION"
 
autrement di:
 


.....
Blablabla.....
*SHELL GENERAL SECTION, ELSET = PSHELL_36, MATERIAL = MAT1_10
0.77           ,
**HWCOLOR COMP         36     3
*SHELL GENERAL SECTION, ELSET = PSHELL_37, MATERIAL = MAT1_11
2.5            ,
**HWCOLOR COMP         37     4
*SHELL GENERAL SECTION, ELSET = PSHELL_38, MATERIAL = MAT1_12
1.27           ,
Blablabla...
.....


 
deviendrait:
 

.....
Blablabla.....
*SHELL SECTION, ELSET = PSHELL_36, MATERIAL = MAT1_10
0.77           ,
**HWCOLOR COMP         36     3
*SHELL SECTION, ELSET = PSHELL_37, MATERIAL = MAT1_11
2.5            ,
**HWCOLOR COMP         37     4
*SHELL SECTION, ELSET = PSHELL_38, MATERIAL = MAT1_12
1.27           ,
Blablabla...


Alors ma requete n'est évidemment pas de vous demander de me pondre le programme mais de me conseiller sur la démarche et les commandes à utiliser.
 
Merci d'avance

Message cité 1 fois
Message édité par a_goodspeed le 18-06-2008 à 10:06:10
Reply

Marsh Posté le 18-06-2008 à 10:39:42    

Je sais, ca peu se faire assez facilement avec WORDPAD, mais le truc c'est quil y a plusieur modifs à faire (dont des un peu plus compliquées plus tard), et que la syntaxe est primordiale... donc, c'est pour faire tout ca sans erreur et surtout ca servirait aussi à d'autres utilisateurs que moi qui ne connaissent pas exactement toutes les modif à faire.

Reply

Marsh Posté le 18-06-2008 à 10:50:51    

a_goodspeed a écrit :


Alors ma requete n'est évidemment pas de vous demander de me pondre le programme mais de me conseiller sur la démarche et les commandes à utiliser.

 

Le C pour ce genre de tache, c'est un peu sortir la grosse bertha pour enlever un nid de frelons. :D
En PERL par exemple, ça se fait en une seule ligne, par exemple :

perl -pi -e 's/SHELL GENERAL SECTION/SHELL SECTION/g' <le nom de ton fichier (ou bien fichiers*)>

 

En C, il te faut, dans l'ordre :
- ouvrir le fichier source en lecture (fopen)
- ouvrir un fichier destination temporaire en écriture (fopen)
- lire chaque ligne du fichier source (fgets)
- réécrire chaque chaîne lue dans un buffer (snprintf) en recherchant "SHELL GENERAL SECTION" (strstr) et en le remplaçant par "SHELL SECTION"
- écrire le buffer dans le fichier destination (fprintf) (tu peux faire cette étape-ci et celle juste avant en une seule passe si tu veux te passer d'un buffer)
- fermer les deux fichiers (fclose)
- déplacer le fichier destination à la place de l'ancien fichier source (rename)

 
a_goodspeed a écrit :

Je sais, ca peu se faire assez facilement avec WORDPAD, mais le truc c'est quil y a plusieur modifs à faire (dont des un peu plus compliquées plus tard), et que la syntaxe est primordiale... donc, c'est pour faire tout ca sans erreur et surtout ca servirait aussi à d'autres utilisateurs que moi qui ne connaissent pas exactement toutes les modif à faire.

 

Et puis surtout, wordpad c'est mignon, mais quand tu as x fichiers à passer et qu'éventuellement tu doives batcher le procédé, c'est pas très pratique.


Message édité par Elmoricq le 18-06-2008 à 10:52:19
Reply

Marsh Posté le 18-06-2008 à 11:10:06    

:sweat: Oulalaaaaaaa...  
 
ben je suis pas sorti de l'auberge, comme on dit!!!!
Mais si j'ai bien compris, pour l'instant j'ai déja plus ou moins fait les étapes 1 et 3 !??
 
Pour le langage Perl, je connais pas du tou! j'avais meme jamais entendu parler...
mais apres ces modifs, il yen aura d'autres du style:
 
- Rechercher tous les MATERIAL="vide"
- Donner le nom du matériau (parmis ceux présents dans le fichier)-> Choix ds une liste
- ajouter le matériau -> MATERIAL = MAT1_50
   
Conclusion: Je m'en sortirai jamais... :cry:


Message édité par a_goodspeed le 18-06-2008 à 11:12:13
Reply

Marsh Posté le 18-06-2008 à 11:16:57    

Tes trois autres taches ne sont pas très différentes de celle que tu as décrite en premier lieu. Je te conseille donc de d'abord de concentrer sur celle-ci, et d'implémenter plus tard les trois autres, cela devrait se faire sans changer l'architecture du programme.

 

Pour PERL, c'est simplement un langage spécialisé dans le parsing et le traitement de fichiers, chaînes de caractères et autre joyeuseté du genre (bon, bien sûr il y a bien plus que ça dans ce langage, mais disons que sa fonction première).

Message cité 1 fois
Message édité par Elmoricq le 18-06-2008 à 11:17:04
Reply

Marsh Posté le 18-06-2008 à 11:41:23    

Ok merci beaucoup.
 
Mais une petite question encore...
Pour mon fichier temporaire, je viens de faire un petit test:
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     FILE *fichierTmp = NULL;
  4.     fichierTmp=fopen("fichier temporaire.inp", "w+" );
  5. //Suite du programme
  6.     fclose(fichierTmp);
  7.     rename("fichier temporaire.inp","X73.inp" );
  8.     return 0;}


 
Ca me créé bien un fichier "fichier temporaire.inp"
Mais il ne le renomme pas en X73.inp parcequ'il existe déjà.
Par contre si je renomme en X73bis.inp (par exemple), ca marche...
Mais bon, ca au pire c'est pas trop grave!


Message édité par a_goodspeed le 18-06-2008 à 11:41:39
Reply

Marsh Posté le 18-06-2008 à 11:55:33    

Ah tiens, je pensais qu'il écraisait l'ancien fichier.
Dans ce cas tu peux utiliser unlink() pour effacer le fichier avant de renommer le nouveau.

Reply

Marsh Posté le 18-06-2008 à 13:28:22    

Elmoricq a écrit :

Tes trois autres taches ne sont pas très différentes de celle que tu as décrite en premier lieu. Je te conseille donc de d'abord de concentrer sur celle-ci, et d'implémenter plus tard les trois autres, cela devrait se faire sans changer l'architecture du programme.

Citation :

Donner le nom du matériau (parmis ceux présents dans le fichier)-> Choix ds une liste


La, ca va demander un peu plus d'efforts.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-06-2008 à 13:31:24    

Ça dépend si la liste est codée en dur ou non, disons que c'est un poil plus complexe mais la mécanique générale reste la même. [:dawa]

Reply

Marsh Posté le 18-06-2008 à 14:11:09    

Codé en dur??? c'est à dire?
 
En fait mon fichier (du coté des matériaux) ressemble à ca:

*MATERIAL, NAME=MAT1_1
*DENSITY
7.800E-09,0.0        
*ELASTIC, TYPE = ISOTROPIC
210000.0  ,0.3       ,0.0        
*MATERIAL, NAME=MAT1_2
*DENSITY
2.700E-09,0.0        
*ELASTIC, TYPE = ISOTROPIC
70000.0  ,0.4        ,0.0    
......
....

   
 
Et je voudrais juste que ca affiche un menu du genre:
 
1: MAT1_1    E = 210000   nu = 0.3   dens = 7.8E-9
2: MAT1_2    E = 70000     nu = 0.4   dens = 2.4E-9
3: ......
 
Ensuite, l'utilisateur choisira juste 1 ou 2 (ou +)
Pour l'affecter là où il faut.
 
Ca, pour le menu ca va... je sais comment faire (je pense)
Mais savoir si c'est codé en dur ou pas...
 

Reply

Marsh Posté le 18-06-2008 à 15:12:26    

Bein essaie. Quand t'as un problème tu reviens ..
Par contre, ça fait une page que je te lis, et j'ai pas encore compris : Pourquoi tu le fait en C? Je dis pas que c'est le langage dans lequel tu vas te faire le plus chier.. mais ça en est pas loin..

Reply

Marsh Posté le 18-06-2008 à 15:59:36    

En fait je travaille avec un logiciel de calculs par éléments finis :ABAQUS"
Le probleme est assez simple:
 
Je récupere un modèle éléments finis (un genre de fichier texte) qui comprend:  
- Les coordonnées des noeuds
- La définition des éléments
- La définition des propriétés
- La définition des matériaux
- Des liaisons....
 
Seumlement, ce fichier est prévu pour un autre code de calculs : NASTRAN (donc tout ca n'est pas codé pareil)
 
Alors pour convertir le fichier "NASTRAN" en fichier "ABAQUS", je passe par un logiciel de préparation/montage de modèle qui peut (plus ou moins bien) fiare la conversion. De là, je récupère un fichier codé en "ABAQUS".
 
C'est là que mon programme intervient: Le logiciel n'a pas TOUT BIEN fait!!! Retse pas mal de modifs à faire, comme supprimer ou ajouter du texte à certains endroits précis... une opération qui peut se répéter plusieurs centaines de fois dans certains cas!!!
Donc sur des fichiers qui font des de 20 à un peu + de 100 Mo, c'est tres long et surtout, la moindre erreur de syntaxe ne pardonne pas!
 
C'est pour à ca que mon prog servira! faire en quelques secondes un manip qui peut prendre du temps et qui peut etre source d'erreurs. :pt1cable:
 
J'espere que mon explication est claire pasque c'est pas forcément évident à suivre...


Message édité par a_goodspeed le 18-06-2008 à 16:00:33
Reply

Marsh Posté le 18-06-2008 à 16:02:03    

si c de la manip de texte, perl et basta quoi :/

Reply

Marsh Posté le 18-06-2008 à 16:15:09    

+1, comme mentionné dans mon post plus haut, PERL est bien plus adapté à ce genre de tache.

Reply

Marsh Posté le 18-06-2008 à 16:40:34    

Je vien de regarder, ca à l'air plus simple, mais je pense que ca me servira beaucoup plus de connaitre un peu le C, surtout en tant dans mon domaine...


Message édité par a_goodspeed le 18-06-2008 à 16:42:12
Reply

Marsh Posté le 18-06-2008 à 16:43:45    

bah non, tu dois apprendre à utiliser l'outil adapté à ton problème et pas l'inverse.  
 
Sans compter qu'on apprends pas le C en 3 mois :o

Reply

Marsh Posté le 18-06-2008 à 16:44:02    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed