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
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 .............. ......
........... TeamMoteurProg...........