2010-03-30 3 views
1

Voici mon code:getline() retourne ligne vide dans Eclipse, mais fonctionne correctement dans Dev C++

#include <iostream> 
#include <stdlib.h> 
#include <fstream> 

using namespace std; 

int main() { 
    string line; 
    ifstream inputFile; 
    inputFile.open("input.txt"); 

    do { 
     getline(inputFile, line); 
     cout << line << endl; 
    } while (line != "0"); 

    return 0; 
} 

input.txt contenu:

5 9 2 9 3 
8 2 8 2 1 
0 

En Enclipse, il va à boucle infinie . J'utilise MinGW 5.1.6 + Eclipse CDT.

J'ai essayé beaucoup de choses mais je n'ai pas pu trouver le problème.

+1

ce qui se passe si vous spécifiez le chemin absolu de « input.txt » au lieu de chemin relatif? – Naveen

+1

il va dans une boucle infinie parce que vous ne vérifiez pas la état du fichier dans la condition Vous devriez vérifier l'état du fichier (pour voir si cela a mal tourné) et vérifier la séquence de terminaison Voir ma réponse ci-dessous –

Répondre

2

Puisque vous êtes sur Windows essayez:

} while (line != "0\r"); 

La dernière ligne est stockée sous forme "0\r\n". Le \n est utilisé comme séparateur de ligne par getline de sorte que la lecture de la ligne réelle sera "0\r"

ou

vous pouvez convertir le fichier de format DOS au format UNIX en utilisant la commande

dos2unix input.txt 

Maintenant votre programme original devrait marcher. La commande va changer la \r\n à la fin de la ligne à \n

Aussi, vous devriez toujours faire la vérification des erreurs après que vous essayez d'ouvrir un fichier, quelque chose comme:

inputFile.open("input.txt"); 
if(! inputFile.is_open()) { 
cerr<< "Error opening file"; 
exit(1); 
} 
+0

Vous avez raison. Lorsque j'ai changé le code pour: inputFile.open ("C: \\ workspace \\ project \\ input.txt"); cela fonctionne. Mais pourquoi? input.txt est situé dans le même dossier. Quelle est la différence entre Dev C++ et Eclipse? – pocoa

+0

@pocoa: le répertoire courant est différent. Eclipse CDT vous permet de spécifier cela sur les propriétés "Exécuter/Déboguer les paramètres" du projet (dans l'onglet "(x) = Arguments"). Je n'ai aucune expérience avec Dev C++, donc je ne sais pas où vous alliez spécifier le répertoire de travail pour exécuter le programme construit. –

+0

@Michael Burr: Savez-vous comment faire cela? – pocoa

2

Il va créer une boucle infinie si aucune ligne ne contient exactement 0. Par exemple 0\n n'est pas la même chose que 0. Je suppose que c'est votre problème.

EDIT: Pour élaborer, getline devrait ignorer le saut de ligne. Peut-être que l'encodage de la nouvelle ligne de votre fichier est erroné (c'est-à-dire Windows vs. Unix).

+1

Juste pour clarifier - un fichier d'entrée qui se termine par '0 \ n' shou Ça ira, mais il y aura des problèmes si vous décrivez si le fichier d'entrée a des espaces (autres que \ n) après le '0'. Donc '' 0 \ n'' échouera et '' 0 \ r \ n''échouera, ce qui pourrait être causé par le problème de codage de fin de ligne Unix vs DOS. –

+0

Je les utilise sous Windows. Même fichier texte et code s'exécutant sur Dev C++ mais échoue sur Eclipse. – pocoa

1

Votre principal problème est le répertoire de travail.
Étant donné que vous spécifiez un fichier en utilisant un chemin relatif, il recherche le fichier à partir du répertoire de travail en cours. Le répertoire de travail peut être spécifié par votre environnement de développement. (Note: Le répertoire de travail n'est pas nécessairement le même répertoire que l'exécutable (c'est une hypothèse commune aux débutants mais qui ne tient que dans des circonstances très spéciales)). Bien que vous ayez une fin spéciale du marqueur d'entrée "0", vous devez également vérifier que getline() n'échoue pas (car il peut y avoir une erreur de sortie pour d'autres raisons (y compris une entrée au format beady). de vérifier l'état du fichier que vous lisez.

int main() 
{ 
    string line; 
    ifstream inputFile; 
    inputFile.open("input.txt"); 

    while((getline(inputfile, line)) && (line != "0")) 
    { 
     // loop only entered if getline() worked and line !="0" 
     // In the original an infinite loop is entered when bad input results in EOF being hit. 

     cout << line << endl; 
    } 
    if (inputfile) 
    { 
     cout << line << endl; // If you really really really want to print the "0" 
          // Personally I think doing anything with the termination 
          // sequence is a mistake but added here to satisfy comments. 
    } 

    return 0; 
} 
+0

Votre programme n'imprimera pas la dernière ligne. – Turtle

+0

Vrai: Mais j'ai supposé que c'était une erreur de programmation de la part de poca car vous ne voulez généralement pas imprimer la séquence de terminaison des données, cela n'a aucune signification en termes de données. Mais c'est facile à réparer. –

+0

Oui, le code était merdique mais le problème n'était pas là. – pocoa

Questions connexes