2016-05-17 1 views
1

J'ai une fonction qui est censée lire un fichier char par char et sortir à la console jusqu'à ce qu'elle atteigne EOF. La fonction fonctionne bien affichant tous les caractères que je veux, mais elle continue juste, et ne s'arrête jamais à la fin.Fonction de problème avec EOF

ci-dessous est la fonction

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    joke.clear(); 
    ch = joke.get(); 
    while (ch != EOF) 
    { 
     cout << ch; 
     ch = joke.get(); 
    } 
} 

Contenu du fichier ci-dessous la liste

"(ligne blanche) Q: Qu'est-ce que la langue disent aux dents?" Comme je l'ai dit, il affiche la ligne très bien, mais la boucle continue après le point d'interrogation.

Vous ne savez pas pourquoi? En outre, plus d'informations sont-elles nécessaires pour répondre correctement à ma question?

Répondre

1

La façon canonique de le faire est la suivante:

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    while (true) 
    { 
     ch = joke.get(); 
     if (joke) { 
      cout << ch; 
     } else { 
      break; 
     } 
    } 
} 

L'expression joke évaluera true jusqu'à ce qu'elle touche EOF. Je ne sais pas pourquoi vous voulez appeler le joke.clear() en premier.

+1

C'est juste une habitude qu'on m'a enseignée quand j'ai commencé avec un fichier. Juste en s'assurant qu'il n'y a pas de drapeaux dessus au début. Pensez-vous que cela ne sert à rien, ou pensez-vous que cela peut nuire à un programme? EDIT :: Comme pour le code que vous avez posté, il progresse certainement le programme, mais ne tient pas compte des caractères espace, et affiche tout sans espaces – Podo

+0

Aussi, curieux si vous avez des idées pourquoi mon code * ne * travail. – Podo

+0

Je ne pense pas que vous devriez appeler aveuglément «clear()». S'il y a des drapeaux, alors ce serait pour une raison et simplement les effacer n'aidera pas. Votre code ne fonctionne pas car les flux C++ ne lisent pas EOF comme un caractère comme le fait C. Les flux C++ lisent les caractères jusqu'à ce qu'ils atteignent EOF. (Ils ne retournent jamais le caractère EOF - c'est un truc en C. – Phil

1

@Phil a répondu "comment faire cela en C++". Ma réponse va dans "pourquoi est-ce qui se passe" et "comment faire ceci en C" (cela fonctionne toujours en C++).


Depuis la table ASCII va tout le chemin de 1 et nous avons la valeur de l'octet 0 ('\0') réservé à terminaison de chaîne (en parlant C et langages C++), l'EOF doit être une valeur particulière en dehors de cela.

C'est pourquoi getchar() et aussi ifstream::get() renvoient un int, pas un char. Donc, tout ce que vous devez faire est de changer

char ch; 

à

int ch; 

et jeté à carboniser pour l'impression:

cout << (char) ch; 

Techniquement, EOF est généralement -1. Votre char peut avoir la plage 0 - 255, ce qui signifie qu'il ne sera jamais égal à -1. Un compilateur décent avec -Wall activé devrait cependant vous donner au moins un avertissement.

+0

Plus généralement, au lieu de' int', utilisez 'std :: istream :: traits_type :: int_type'. Cela fonctionne pour tous les encodages de caractères, pas seulement ASCII. –