2010-03-11 5 views
0

Je dois écrire juste une fonction qui compte le nombre d'entiers dans un fichier texte déjà ouvert et bon.Fonction qui compte le nombre d'entiers dans un fichier texte?

a. Supposons qu'il existe un fichier texte avec un grand nombre d'entiers divisé par des espaces

b. Ecrivez une fonction appelée analyseFile qui accepte un objet de fichier ifstream en tant que paramètre, et compte le nombre d'entiers dans le fichier.

c. Il n'a pas besoin de faire quoi que ce soit avec les entiers, mais il doit compter exactement le nombre correct d'entiers dans le fichier et retourner ce nombre à la fonction appelant.

d. Il n'a pas non plus besoin de manipuler les opérations de fichiers elles-mêmes, donc il n'a pas besoin de fermer le fichier ou de mener d'autres actions que de compter les entiers et de retourner le nombre d'entre eux.

Merci pour toute aide sur mon problème!

Edit: Voici ce que j'ai en fonction faire beaucoup, il est juste, je ne sais pas:

int analizeFile (ifstream &inf, const string &fileName) { 
    int count = 1; 
    int num; 
    fin.open(fileName.c_str()); 
    fin >> num; 
    while (fin.good()) { 
     fin>> num; 
     count ++; 
    } 
    return count; 
} 
+4

Montrez-nous du code que vous avez écrit. Et tous les problèmes que vous avez rencontrés. – dirkgently

+0

Oui, s'il vous plaît poster ce que vous avez jusqu'à présent, et quel est le problème. Sinon, il semblerait que vous vouliez que nous fassions vos devoirs pour vous. –

+0

Voici ce que j'ai en tant que fonction faire loin, est-ce exact, je ne sais pas: int analizeFile (ifstream & inf, chaîne const & nom_fichier) { int count = 1; int num; fin.open (nomFichier.c_str()); fin >> num; while (fin.good()) { fin >> num; compte ++; } nombre de retour; } – Elaina

Répondre

2

Commentaires:

int analizeFile (ifstream &inf, const string &fileName) { 

Depuis le compte est toujours une quantité non négative, je préfère utiliser size_t plutôt qu'int. Nit: Vous pouvez changer le nom de la fonction en analyzeFile.

int count = 1; 

Problème commence ici: Si votre fichier n'a pas de nombre entier, vous renvoyez un mauvais résultat.

int num; 
    fin.open(fileName.c_str()); 

Pas besoin d'appeler open. Ce serait généralement appelé par le ifstream ctor.

fin >> num; 
    while (fin.good()) { 

Encore une fois, cela n'est pas nécessaire. Vous pouvez extraire du flux et tester dans la condition while - quelque chose qui est plus fréquemment utilisé.

fin>> num; 
    count ++; 
    } 
    return count; 
} 
+1

+1 pour avoir pris le temps et avoir de la difficulté à éduquer plutôt que d'afficher une solution. – razlebe

+0

Si oui ou non ce poste * a éduqué * le PO est certainement discutable. À ce stade du «curriculum» des OP, je pensais qu'un exemple clair et simple serait le plus avantageux. Si le PO était prêt à apprendre sur les types entiers signés et non signés et les constructeurs, cela aurait été évident à partir de la question du PO. Voir un extrait de code avec la connaissance a priori de ce qu'il fait peut être très instructif! –

+0

Plus important encore, le 'fin.good()' est même faux. Étant donné ce contenu de fichier: "21", alors s'il initialise 'count' à' 0', il pensera qu'il y a des nombres '0' dans le fichier (parce que' good() 'renvoie false si le bit eof est défini) . De l'autre côté s'il initialise 'count' à' 1', et que le contenu est "21", alors il pensera qu'il y a deux nombres puisque après avoir lu 21, aucun bit eof ou fail n'est encore défini. –

2

Vous pouvez utiliser une approche fonctionnelle trop

// it was previously opened, so you don't need a filename. 
int analyzeFile (istream &inf) { 
    std::istream_iterator<int> b(inf), e; 
    return std::distance(b, e); 
} 

Si l'itérateur ne peut pas lire un entier, il définira l'état d'échec sur le flux et comparera égal à la fin iterator. distance renvoie ensuite le nombre d'étapes d'itération nécessaires pour atteindre l'itérateur de fin.

Questions connexes