2009-05-05 12 views
0

Je sais qu'il est possible d'obtenir une partie d'un fichier .txt, puis de le convertir en entier, puis de le stocker dans une variable, mais cela est possible dans une seule déclaration. (La variable doit être globale).Existe-t-il une fonction qui renvoie le caractère/la chaîne à un point dans un fichier .txt?

Ie:

[data.txt] 
1020 
[convert_data.cpp] 
#include<fstream> 
fstream convert("data.txt"); 
//way to declare something equal to A PARTICULAR POINT in data.txt 

int main() 
{ 
    //how would I take this block of code and simplify it to two DECLARATIONS (not 
    //function calls), or, if that's not possible or not practical, how would I make 
    //n and m (or var1 and var2) global AND CONSTANT? 
    char var1[5]; 
    convert.getline(var1,2); 
    char var2[5]; 
    convert.getline(var2,2); 
    const int n=atoi(var1); 
    const int m=atoi(var2); 
    return 0; 
} 

Répondre

0

Non, vous ne pouvez pas le faire en une seule déclaration. Vous pouvez écrire une fonction pour faire cela, et ensuite vous pouvez initialiser les variables locales avec cette fonction, mais vous ne pouvez pas initialiser les variables globales avec cette fonction. Si vous voulez initialiser des variables globales, vous devez le faire explicitement pendant la routine d'initialisation de votre programme, ou vous pouvez le faire dans le constructeur d'un objet global (non recommandé).

+0

En fait, la création d'une fonction à utiliser dans une déclaration globale est probablement exactement ce dont j'ai besoin (oxymoron non destiné). –

0

Du point de vue du compilateur, une constante est quelque chose qui a une valeur fixe au moment de la compilation. Puisque vous lisez vos données à partir d'un fichier texte (qui peut être modifié après la compilation du programme), les nombres lus dans le fichier texte ne peuvent pas être des constantes dans votre programme.

Cela dit, vous pouvez faire quelque chose comme ceci:

class ConstInteger { 
public: 
    ConstInteger(fstream &f) { 
     char s[5]; 
     f.getline(s,2); 
     value = atoi(s); 
    } 
    public operator int() const { return value; } 
private: 
    int value; 
}; 

fstream convert("data.txt"); 
ConstInteger n(convert); 

Le repose ci-dessus sur l'initialisation du compilateur C++ fait pour les classes mondiales. En conséquence, vous êtes largement à la merci du compilateur C++ en ce qui concerne l'ordre d'initialisation des classes. En outre, la gestion des erreurs dans cet arrangement peut être gênante. (Par exemple, que se passe-t-il si data.txt n'existe pas?)

+0

Pas tout à fait vrai, car le code ci-dessus avait n et m étant des constantes, et les deux étant lus à partir d'un fichier. Je cherche simplement un moyen de raccourcir cela en une seule déclaration et de la rendre globale. –

+0

Je réalise cela; J'ai donné un exemple pour un entier. Vous êtes libre d'adapter mon exemple à deux entiers si vous le souhaitez. –

+0

Dans une unité de traduction, la norme C++ garantit que les constructeurs globaux sont appelés dans l'ordre dans lequel ils sont déclarés. –

0

Si je comprends bien, vous voulez lire une partie d'un fichier texte et stocker la valeur comme une constante? Eh bien vous ne pouvez pas avoir une constante non initialisée - donc une déclaration globale à laquelle vous assignez à l'exécution. Peut-être que la façon de le faire est d'encapsuler la fonctionnalité que vous avez dans une fonction globale appelée getConstant, cela pourrait contenir une variable statique et l'appel à getConstant vérifierait si la var a été lue dans le fichier, si elle a ensuite renvoyer la constante, sinon lu dans le fichier. Évaluation paresseuse. Bien sûr, cela ne résout pas le problème d'avoir besoin (?) D'être constant.