Premier programme C (manip. de fichiers txt) - C - Programmation
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?
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!!
Marsh Posté le 17-06-2008 à 10:20:39
Première question naïve : c'est censé être du C ou du C++?
Marsh Posté le 17-06-2008 à 10:22:01
ReplyMarsh 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?
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...
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++
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 :
|
Ca, c'est assez simple, mais c'est apres, pour passer en paramètre FILE* que j'ai un peu de mal!!
Marsh Posté le 17-06-2008 à 10:55:35
Code :
|
Je pense qu'il manque quelquechose dans le compteurORIENT.c et compteurSHELL.c:
Code :
|
Message d'erreur:
`fichier' undeclared (first use in this function)
Marsh Posté le 17-06-2008 à 11:10:35
À voir t'as pas défini "fichier" alors que tu tentes de l'utiliser
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...
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?
Marsh Posté le 17-06-2008 à 11:25:57
je récapitule là où j'en suis exactement
Main:
Code :
|
Mon "compteurSHELL.c" (qausi identique à "compteurORIENT.c" )
Code :
|
Et mon header compteurs.h
Code :
|
Je ne sais pas où mettre quoi pour que ca marche!
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.
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!!
Marsh Posté le 17-06-2008 à 12:56:47
Bon ...
Code :
|
Compris?
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".
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?
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 :
|
Mon (mes) compteur:
Code :
|
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.
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!
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:
|
deviendrait:
..... |
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
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.
Marsh Posté le 18-06-2008 à 10:50:51
a_goodspeed a écrit :
|
Le C pour ce genre de tache, c'est un peu sortir la grosse bertha pour enlever un nid de frelons.
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.
Marsh Posté le 18-06-2008 à 11:10:06
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...
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).
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 :
|
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!
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.
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+,
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.
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 |
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...
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..
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.
J'espere que mon explication est claire pasque c'est pas forcément évident à suivre...
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.
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...
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
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.
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
Mon compteurSHELL.c (quasiment identique au compteurORIENT.c)
Et mon compteur.h (composites des compteurSHELL et 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