RECHERCHER :
COMMUNAUTE MP
Identifiez vous ...
Devenir Membre
J'ai oublié mon MDP
DOMAINE MP
Bavardages
Langages Généraux
Langages Web
Langages DotNet
Autres langages
Dev. Jeux Video
Sécurité
Sys. Exploitation
Graphismes
Logiciels
Réseaux
Bases de données
Méthodologies
Emplois High-tech
Aide juridique
Articles juridiques
FORUM
Index des forums
Ajouter un sujet
Rechercher sujet
Contact Responsable
Devenir modérateur
CHAT MP IRC
Votre pseudo ...
Serv: irc.irc-land.org
Chan: #MoteurProg
PARTICIPER
Plus de 3500 emplois.
Rechercher un job
Déposez votre CV
Emplois High-tech

Visiteur MP

 Pb d'ouverture de fichier

Forum : C & C++ - CONSOLE
Sous Catégorie : Console
Type du sujet : Sujet Normale
FAQ : FAQ C & C++ - CONSOLE

SUIVI DES SUJETS PAR MAIL

SUIVI PAR MAIL INACTIF

RESOLUTION DU SUJET SUJET NON RESOLU
BLOQUAGE DU SUJET SUJET ACTIF
APPARTENANCE A LA FAQ N'APPARTIENT PAS A LA FAQ


POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

FORUM C & C++ - CONSOLE

PREMIERE PAGE

PAGE PRECEDENTE

Page précedente

Page suivante

PAGE SUIVANTE

DERNIERE PAGE
TuXWeb
Nouveau membre
Inscrit : 02/12/2006
Messages : 1
Message
#117304
Posté le 02/12/06 à 11:23
Bonjour alors voilà mon pb... Je suis en train de tenter de coder un petit éditeur un console... Et j'ai un problème, en fait quand on ouvre un fichier pour le lire/modifier, et qu'on le ferme, on ne peut pas le ré-ouvrir pour le relir/remodifier sans quitter le programme... On est l'erreur dans mon code ? (Voici mon code source pour vous aider à répondre :p)

#include <stdio.h> #include <stdlib.h> #include <dirent.h> static void purger(); static void clean (char *chaine); void videTableau (char tableau[], long taille); int listeDossier (DIR *dossier, char extension[]); int main(void) { //Déclaration des variables //Variables pour le programme dans son ensemble long choixMenu = 0; long i = 0; //Pour utiliser les "for" int quitter = 1; //0 == On quitte le programme // Variables pour le fichier texte char nomFichier[20]; FILE *fichier = NULL; char extension[] = ".npt"; DIR *dossierCourrant = "textes"; //Variables pour les dossiers char listeDesFichiers[100]; char caractere = 0; char texte[300]; char destination[] = "textes/"; struct dirent * dirData; //Fin de la déclaration des variables //On vide tous les tableaux videTableau(nomFichier, 20); videTableau(listeDesFichiers, 100); videTableau(texte, 300); //Le programme en lui-même while (quitter) //Tant qu'on ne quitte pas { /*Menu */ printf ("\t\tBienvenue sur Note Pad TuXWeb\n"); printf ("\tMenu :\n"); printf ("1) Creer un nouveau fichier\n"); printf ("2) Ouvrir un fichier\n"); printf ("\n3) Quitter\n"); printf ("\tVotre choix : "); scanf ("%ld", &choixMenu); //On dirige l'utilisateur selon ses choix switch (choixMenu) { //Il créer un nouveau fichier case 1: system("CLS"); printf ("Comment voulez-vous appeler ce fichier texte ?\n(20 caracteres max, sans espace) : "); scanf ("%s", nomFichier); strcat(nomFichier, extension); //On ajoute l'extention au nom choisi strcat (destination, nomFichier); //on rajoute le dossier vers lequel sera dirigé le fichier fichier = fopen(destination, "w+"); //On ouvre le fichier if (fichier != NULL) //Si le fichier est ouvert alors on fait fonctionner la suite { system("CLS"); printf ("Vous pouvez entrer votre texte (300 caracteres max) \n"); clean(texte); //On supprime le '/n' enregistré fgets(texte, sizeof texte, stdin); //On enregistre le texte dans la mémoire vive clean(texte); //On nettoie le texte fprintf(fichier,"%s", texte); //Puis on l'enregistre dans le fichier fclose(fichier); //on a fini de travailler sur le fichier, on le ferme //Puis on lui donne le nom que l'utilisateur voulait system("CLS"); //On efface l'écran pour afficher le menu } else printf ("Impossible de creer le fichier."); system("CLS"); break; //Il ouvre un fichier case 2 : system("CLS"); if (listeDossier(dossierCourrant, extension)) { printf("Quel fichier voulez-vous ouvrir ? : "); //On demande quel fichier ouvrir scanf ("%s", nomFichier); //On enregistre la demande dans la variable printf("\n\tQuel voulez-vous faire du fichier %s", nomFichier); printf("\n1) Seulement le lire"); printf("\n2) Le reediter"); printf("\n\tVotre choix : "); scanf ("%ld", &choixMenu); //On enregistre le choix de l'utilisateur /* Puis on le guide dans le dossier textes */ strcat (destination, nomFichier); if(choixMenu == 1) //Lecture seule { fichier = fopen(destination, "r"); system("CLS"); if(fichier != NULL) { // Boucle de lecture des caractères un à un do { caractere = fgetc(fichier); // On lit le caractère printf("%c", caractere); // On l'affiche } while (caractere != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier) printf ("\n"); system("PAUSE"); if (fclose(fichier) != EOF) //Puis on ferme le fichier { printf ("\nFichier ferme.\n"); system ("PAUSE"); system ("CLS"); } } else printf ("\tErreur : impossible d'ouvrir le fichier specifie\n\n\n\n"); } else if (choixMenu == 2) //Réédition du fichier { fichier = fopen(destination, "r+"); //Lecture / Ecriture system("CLS"); if(fichier != NULL) { // Boucle de lecture des caractères un à un do { caractere = fgetc(fichier); // On lit le caractère printf("%c", caractere); // On l'affiche } while (caractere != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier) clean(texte); //On supprime le '/n' enregistré fgets(texte, sizeof texte, stdin); //On enregistre le texte dans la mémoire vive clean(texte); //On nettoie le texte fprintf(fichier,"%s", texte); //Puis on l'enregistre dans le fichier fclose(fichier);//Puis on le ferme } else printf ("\tErreur : impossible d'effectuer l'action demandee\n\n\n\n"); } } break; //Il quitte le programme case 3: system("CLS"); printf ("Merci d'avoir utilise Note Pad TuXWeb... @bientot"); quitter = 0; //Quitter == 0 le programme ce termine car on sort de la boucle et on tombe sur return 0; break; //Il a entré un caractere non valide default : system("CLS"); printf ("Vous choix n'est pas valide, veuillez recommencer svp...\n\n"); break; } } return 0; } //Liste des fonctions utilisées dans le programme static void purger() { int i; while ((i = getchar()) != '\n' && i != EOF) {} } static void clean (char *chaine) { char *p = strchr(chaine, '\n'); if (p) { *p = 0; } else { purger(); } } void videTableau (char tableau[], long taille) { long i = 0; for (i = 0 ; i < taille ; i++); //On initialise le tableau de texte { tableau[i] = 0; } } int listeDossier (DIR *dossier, char extension[]) { struct dirent * dirData; long i = 0; dossier = opendir(dossier); if (dossier) { printf("Liste des fichiers : \n"); while(dirData = readdir(dossier)) //On fait la liste de tout les fichiers { if(strstr(dirData->d_name, extension) != NULL) { printf("\t%s\n", dirData->d_name); i++; } } return 1; //On renvoie 1 car le fichier a été ouvert } else { printf ("Impossible d'ouvrir le dossier voulu\n"); system ("PAUSE"); system ("CLS"); return 0; //On renvoie 0 car le fichier n'est pas ouvert } }


PS : pourriez-vous aussi me donner un lien où il est expliqué clairement comment utiliser fgets à la place de scanf, et aussi quelques conseils pour bien organiser et éclaircir mon code source... Merci d'avance

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Publicité
Inscrit : X
Messages : X
Message
#Aucun

HAUT DE PAGE

  

rainbow
Membre du club
Chef de projet(s) :
- IA savane
- Team MoteurProg

Avatar de rainbow
Inscrit : 26/05/2006
Messages : 933
Message
#117305
Posté le 02/12/06 à 12:02
slt,
déjà, une petite astuce pour simplifier les test:
if(fichier!=NULL) peut être remplacé par if(fichier)

ensuite, tu mets trop de code dans ton switch. Appelle une fonction pour chaque case (sauf le default) ce sera plus simple.

Pour ce qui est de le fermeture, je n'ai pas trop le temps de tout bien regarder, mais vérifie que tu as bien fermé tout tes fichiers correctement etc. Car en fait, le programme n'a "pas le temps" de revenir à l'accueil, il doit avoir un bug avant.

Voila, j'espère que je t'ai un peu aidé
a+ rainbow

P.S. Dans ton while de départ, met un "system("cls");" au début de la boucle, ce sera mieux que on reviendra à l'accueil.
P.P.S. Tu pourrais aussi lire tes fichiers via les commandes ms-dos appellées par system("ma_commande"); Pour utiliser une string qui contient un nom : system(nom.c_str());
__________________________
............ Curtis: RTS 3D ..............
......Image
........... TeamMoteurProg...........

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 


    PAGE : [1]



.: Site Web développé par Julien Pichot et l'équipe MPWG avec www.evolvia-web.com :.