Fonction de lecture de fichier [Résolu]

Signaler
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005
-
Messages postés
5
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
27 février 2005
-
Bonjour, je suis nouveaux en c, et je veux utiliser une fonction pour
ouvrir mes fichiers (eviter a chaque foix de tester si ouverture ok ...
etc)

Voila mon code

///////////////////////////////////////////////////////////////////////////////////////////////////////

/**

* ouverture d'un fichier

* @param *directionFichier Le nom du fichier sur le disque

* @param *file Le nom du fichier en memoire

* @param *wr savoir si en lecture ou en ecriture

*/

void ouvrir(char directionFichier[256], FILE *file, char wr[256]){

if((file fopen(directionFichier, wr)) NULL ){

printf("Error while connecting to FILE \'%s\'\n", directionFichier);

getch();

exit(EXIT_FAILURE);

}

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////

il ne me retourne aucune erreur, tout va bien; mais quand je veux lire:

//////////////////////////////////////////////////////////////////////////////////////////////////////////

ouvrir("a991", fichier, "r");

fscanf(fichier, "%s", resultat);

printf("resultat: %s\n", resultat);

//////////////////////////////////////////////////////////////////////////////////////////////////////////

il me lance un erreur de memoire, le fichier ne peut etre lu :(

Quelqu'un pourrait-il m'aider, merci

12 réponses

Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
C'est normal puisque fichier n'est pas initialisé.

Attention aux const, et penses aussi à utiliser perror




void ouvrir( const char *directionFichier, const char *wr, FILE **file )

{

*file = fopen( ... );

}





Pour debuter ca ne gène pas trop, aprés il faudra plutot faire remonter l'erreur.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
FILE* fishloc;
ouvrir("fishloc", &fishloc, "w");
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005

Merci pour ton aide, et pour le perror c'est pratique comme methode :)
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005

Voila ce que ca donne pour que ca marche :

########################################################################

// fonctions



/**

* fermeture d'un FILE

* @param *file Le nom du fichier en memoire

*/

void fermer(FILE **file){

if(fclose(*file) == EOF){

perror("erreur de fermeture du fichier");

printf("Error while trying to close \'%s\'\n", file);

}

} // fin de fermer



/**

* ouverture d'un FILE

* @param *directionFichier Le nom du fichier sur le disque

* @param *file Le nom du fichier en memoire

* @param *wr savoir si en lecture ou en ecriture

*/

void ouvrir(const char *directionFichier, FILE **file, const char *wr){

*file = fopen(directionFichier, wr);

if(*file == NULL ){

perror("erreur d'ouverture du fichier");

printf("Error while connecting to FILE \'%s\'\n", directionFichier);

getch();

exit(EXIT_FAILURE);

}

}



// main

FILE **fichierLoc;

// en lecture

ouvrir(fLoc, fichierLoc, "r");

fscanf(*fichierLoc, "%d", &num); // lecture du num de la pop



if(fclose(*fichierLoc) == EOF){

printf("Error while trying to close \'%s\'\n", fLoc);

}



// pour un fichier en lecture :

// char **tabPop

fprintf(*fichierEnLecture, "%s", tabPop[num]);

########################################################################
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005

Mon dieux mon dieux DSL les pointeurs c'est pas mon fort lol

j'ais pas trouve comment modifier mon prescedent texte alors je le refait.



########################################################################

// fonctions



/**

* fermeture d'un FILE

* @param **file Le nom du fichier en memoire

*/

void fermer(FILE **file){

if(fclose(*file) == EOF){

perror("erreur de fermeture du fichier");

printf("Error while trying to close \'%s\'\n", file);

}

} // fin de fermer



/**

* ouverture d'un FILE

* @param *directionFichier Le nom du fichier sur le disque

* @param **file Le nom du fichier en memoire

* @param *wr savoir si en lecture ou en ecriture

*/

void ouvrir(const char *directionFichier, FILE **file, const char *wr){

*file = fopen(directionFichier, wr);

if(*file == NULL ){

perror("erreur d'ouverture du fichier");

printf("Error while connecting to FILE \'%s\'\n", directionFichier);

getch();

exit(EXIT_FAILURE);

}

}



// main

FILE **fichierLoc;

// en lecture

ouvrir(fLoc, fichierLoc, "r");

fscanf(*fichierLoc, "%d", &num); // lecture du num de la pop



if(fclose(fichierLoc) == EOF){

printf("Error while trying to close \'%s\'\n", fLoc);

}



// pour un fichier en lecture :

// char **tabPop

fprintf(*fichierEnLecture, "%s", tabPop[num]);

########################################################################


Voila comme ca y a pas de problemes
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005

Bha voila ca continue :(

J'ouvre plusieur fichiers en lecture avec ma fonction ouvrir() -qui
marche bien- et je me retrouve avec une erreur de memoire : l'adresse
ne peut pas etre ecrite.

J'ais ouvert en lecture puis ferme un fichier, l'ouverture de l'autre
fichier n'a pas pose de probleme. Mais si je le laisse ouvert alors il
y a un probleme. Quelqu'un peut me dire pourquoi?

#########################################################################

FILE **fishloc;

ouvrir("fishloc", fishloc, "w");

// ...

fermer(fishloc);

FILE **rndSeed;

ouvrir("RND_seed.97", rndSeed, "r");

// la pas de probleme

FILE **fichierLocus;

ouvrir("locus.txt", fichierLocus, "r");

// la y a un message d'erreur de memoire

########################################################################
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005

j'ais utilise le debugger, il me dis que c'est une erreur de segmentation dans ma fonction ouvrir()

: *file = fopen(directionFichier, wr);

Je sais pas ce que c'est.
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005

Merci enormement. Je nage complettement dans les pointeurs, c'est une catastrophe.



Donc au finale ca donne

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h> // FILE, perror

//

// fonctions

//

/**

* fermeture d'un FILE

* @param **file Le nom du fichier en memoire

* @param *directionFichier Le nom du fichier sur le disque

*/

void fermer(FILE **file, const char *directionFichier){

if(fclose(*file) == EOF){

perror("erreur de fermeture du fermeture:\n");

printf("Error while trying to close \'%s\'\n", directionFichier);

}

} // fin de fermer



/**

* ouverture d'un FILE

* @param *directionFichier Le nom du fichier sur le disque

* @param **file Le nom du fichier en memoire

* @param *wr savoir si en lecture ou en ecriture

*/

void ouvrir(const char *directionFichier, FILE **file, const char *wr){

*file = fopen(directionFichier, wr);

if(*file == NULL ){

perror("\nerreur d'ouverture du fichier:\n");

printf("Error while connecting to FILE \'%s\'\n", directionFichier);

getch();

exit(EXIT_FAILURE);

}

}

//

// utilisation

//

FILE *fichLocus;

ouvrir(fLocus, &fichLocus, "r");

fscanf(fichLocus, "%d %d", &n, &m);

fermer(&fichLocus, fLocus);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Voila j'espere que ma souffrance evitera a d'autres noob la meme peine
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
tu ne devrais pas t'inquietter, les pointeurs en langage C n'ont rien
de complexe, c'est juste qu'il faut savoir quelques bases la dessus.



Un pointeur est une variable qui contient l'adresse (souvent virtuelle, mais ne t'en occupe pas) d'une autre variable.



il faut connaître 2 opérateurs unaires ( op<operande>):


<li>l'opérateur * , qui permet de déférencer un pointeur, c'est à
dire de retourner la valeur de la variable pointée par le pointeur.</li>
<li>l'opérateur & (address of) qui retourne l'adresse de la variable sur laquelle il s'applique.</li>

En application:



int n = 5; /* un entier */

int *p = &n; /* un pointeur sur entier p initialisé avec l'adresse de n (grace à l'opérateur &) */



p *p <valeur de n, c'est à dire 5>



au niveau des types:



n est de type int

&n est de type int* (pointeur constant)

p est de type int*

*p est de type int (puisque c'est la valeur de la variable de type int pointée par p)

&p est de type int** (pointeur constant)



un cas d'utilisation: faire en sorte qu'une fonction puisse modifier un de ses paramètres



int f(int a); /* f ne peux pas modifier "a" car en C les paramètres sont toujours passés aux fonctions pas copie */



la solution, plutot que de passer la valeur de a, c'est de passer sont adresse (qui est de type int*).



int f(int *p)

{

*p = 5; /* l'opérateur * permet d'acceder à la valeur */

return 0;

}



et l'appel donne



f(&a); /* on lui passe l'adresse de a */



c'est pour ca que:



FILE* fishloc;
ouvrir("fishloc", &fishloc, "w");
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005

Alors ca c'est sympat de me filler un cours sur les pointeurs. Merci, c'est claire et precis. Bravo même. :)
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
de rien, content que cela t'ai aidé à y voir plus clair
Messages postés
5
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
27 février 2005

Salut, j'ai un petit problème en c++.

Iterator est un pointeur vers un Item.
FileSystem est une classe dans laquelle est comprise la classe Item.
FileSystem est un friendclass de Item mais je n'arrive pas à prendre l'adresse de la variable _name de mon objet.

Voici la classe Item et FileSystem :

class FileSystem {


public:


typedef enum { DIRECTORY, FILE } FileType;


private:


class Item {
private:
Item(char *_name, FileType _type, Item *_next, Item *_contents);
char *_name;
FileType type;
Item *next, *contents;
friend class FileSystem;
};


Item *head;


public:


typedef Item *Iterator;


FileSystem();
~FileSystem();


Iterator insert(Iterator i, char *name, FileType type);
Iterator find(char *name);
void remove(Iterator i);
Iterator root();
Iterator next(Iterator i);
Iterator contents(Iterator i);
FileType type(Iterator i);
char *name(Iterator i);
bool valid(Iterator i);
};

Voici ma méthode

char FileSystem::*name(FileSystem::Iterator i)
{
return (i._name);
}

voici l'érreur :

request for member '_name' in 'i' wich is of non-aggregate type 'FileSystem::Item'

Merci d'avance !