2010-07-25 6 views
1

Je construis un programme qui a plusieurs fonctions qui ont besoin de lire les données d'un fichier. Puisque les fonctions sont assez fréquemment utilisées, l'ouverture et la fermeture du fichier pour chaque appel prendrait trop de temps, donc mon plan était de rendre l'objet FILE * global, et d'avoir le fichier ouvert pendant toute la durée du programme. Apparemment, cependant, il est impossible, puisque ceci:Création d'un objet FILE * global?

#include <fstream> 
FILE * yhtit; 
yhtit = fopen("thefile.txt","r"); 
int main() { 
return 0; } 

donne erreur: main.cpp|54|error: expected constructor, destructor, or type conversion before ‘=’ token|

Quelle est la meilleure façon de garder un fichier ouvert toute la durée du programme, sans avoir à passer séparément le FILE * objet à chaque fonction qui en a besoin?

+0

SInce que vous utilisez FICHIER *, il s'agit simplement d'une question C et non d'une question C++. –

+0

Vous devez placer votre pointeur FILE * dans une classe Singleton Logging et l'initialiser paresseusement. Effectivement se résume à avoir un objet global (singleton), mais c'est beaucoup plus soigné si vous utilisez 'Singleton' (par rapport à l'utilisation d'un' global FILE * '.) – bits

+0

@bits: Comment une classe Singleton Logging aider avec fonctionnalité où" plusieurs fonctions ... besoin de lire les données d'un fichier "? Aussi, pourquoi un singleton est-il plus" net "qu'un global? Essayer de faire un objet" FILE * "comme un singleton semble être un abus de singleton car il est manifestement valide chose à faire pour avoir plusieurs fichiers ouverts dans un seul programme –

Répondre

7

Vous avez presque réussi. Essayez ceci:

#include <fstream> 

FILE * yhtit; 

int main() { 
    yhtit = fopen("thefile.txt","r"); 

    //Do your thing here. 

    fclose(yhtit); 
    return 0; 
} 
+0

-1 pour la solution de variable globale – Dacav

+7

Pour être juste, une solution variable globale était ce que la question demandait – wrosecrans

+0

Downvote comptée – syb0rg

0
#include <fstream> 
FILE * yhtit = fopen("thefile.txt","r"); 
int main() { 
    return 0; } 
+0

-1 pour la solution variable globale – Dacav

+0

@Dacav: La variable globale fait partie de la question: SCFrench ne l'a pas introduit dans sa solution, il a juste corrigé son initialisation –

4

Il serait préférable de passer le pointeur FILE à vos fonctions que de créer une variable globale. Les variables globales sont souvent des odeurs de code — des signes de codage douteux. Vous pouvez passer le fichier à vos fonctions sans devoir ouvrir et fermer le fichier plusieurs fois. Par exemple:

#include <stdio.h> 

void readData(FILE *); 
void readMoreData(FILE *); 

int main() { 
    FILE *fp = fopen("...", "r"); 

    readData(fp); 
    readMoreData(fp); 

    fclose(fp); 
    return 0; 
} 
+0

Y Je suis d'accord pour dire que c'est une pratique douteuse et que cela figure sur ma liste de choses à faire, mais pour l'instant, j'essaie simplement de faire fonctionner cette chose. – tsiki

+1

@tziki: ce n'est pas grave de passer un argument de plus dans votre liste de paramètres. Placer une variable globale est vraiment une mauvaise idée et vous rendra la tâche difficile lorsque vous devrez modifier le code source dans le futur (en particulier avec le multithreading, les variables globales sont également difficiles à tracer quand vous analysez un programme!) – Dacav

-1

Vous pouvez maintenir la variable File * dans une structure et rendre cette structure accessible à partir de toute fonction.

typedef struct 
{ 
FILE *fp; 
//other members can also be part of this structure. 
}myData; 

appInit(myData *ptr) 
{ 
ptr->fp = fopen(<>,<>); 
//Initialise other variables also 

return; 
} 

appDeInit(myData *ptr) 
{ 

fclose(ptr->fp); 
} 


main() 
{ 
myData *ptr= malloc(sizeof(myData)); 
appInit(ptr); 
//Play with ptr in all your function calls 
foo(ptr); 


appDeInit(myData); 
} 
Questions connexes