2009-04-08 4 views
1

Je pense que je pourrais avoir besoin d'utiliser un bValue booléen = false pour mon while condition:ifstream object.eof() ne fonctionne pas

char cArray[ 100 ] = ""; 
ifstream object; 
cout << "Enter full path name: "; 
cin.getline(cArray, 100); 
if (!object) return -1 // Path is not valid? This statement executes why? 

ifstream object.open(cArray, 100); 

// read the contents of a text file until we hit eof. 
while (!object.eof()) 
{ 
// parse the file here 

} 

Pourquoi ne puis-je pas entrer le nom de chemin complet du fichier texte?

Il pourrait être à cause de l'eof. Est-ce que leur syntaxe est une instruction booléenne qui peut émuler eof?

Puis-je avoir:

while (!object == true) 
{ 
// parase contents of file 
} 
+0

Vous n'avez pas compilé ce code dans un compilateur C++, à moins que vous en quelque sorte des erreurs redéfini. L'avez-vous retapée à partir de ce qui a effectivement été compilé? Peut-être que vous devriez copier et coller le code avec lequel vous avez un problème. –

Répondre

-1

La fonction ifstream::open prend un nom de fichier et un mode optionnel. Puisque vous voulez lire le fichier entier, pourquoi ne pas simplement commencer au début:

ifstream obj(cArray); 
if (obj) { // file successfully opened for reading 
    while (obj.good()) { 
     // read in a line at a time 
     string line; 
     getline(line, obj); 
     if (!line.empty()) { // we have something to work with 
      // parse 
     } 
    } 
} 

Bien sûr, une version plus lisse est de tester getline dans la boucle while comme Neil Butterworth.

+0

Je suppose que je ne peux pas lire tout le chemin du fichier .. Il pourrait même ne pas être un problème avec l'eof – user40120

+0

@lampshade: Vérifiez si votre mémoire tampon cArray est assez grand pour le chemin du fichier ou non. – dirkgently

+0

ce n'est vraiment pas une bonne idée - "parse" sera appelé même si getline ne pouvait rien lire –

7

Pourriez-vous, vous et tous les autres, noter que la bonne façon de lire un fichier texte ne nécessite PAS l'utilisation des fonctions eof(), good(), bad() ou indifferent() (OK, j'ai fait le dernier un en haut). La même chose est vraie en C (avec fgets(), feof() et al). Fondamentalement, ces drapeaux ne seront définis qu'après avoir essayé de lire quelque chose, avec une fonction comme getline(). Il est beaucoup plus simple et plus correct de tester les fonctions de lecture, comme getline() a réellement lu quelque chose directement.

Non testé - Je suis mise à niveau mon compilateur:

#include <iostream> 
#include <fstream> 
#include <string> 
using namespacr std; 

imt main() { 

    string filename; 
    getline(cin, filename); 

    ifstream ifs(filename.c_str()); 
    if (! ifs.is_open()) { 
     // error 
    } 

    string line; 
    while(getline(ifs, line)) { 
     // do something with line 
    } 
} 
+0

puis-je utiliser un scénario contrôlé alors condition? Insted de votre getline (ifs, ligne)? – user40120

+0

Je ne comprends pas ce que vous voulez dire par "senteinal" –

+0

http://en.wikipedia.org/wiki/Sentinel_value –