getline () retourne ligne vide dans Eclipse, mais fonctionne correctement dans Dev C ++

StackOverflow https://stackoverflow.com/questions/2543057

  •  23-09-2019
  •  | 
  •  

Question

Voici mon code:

#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

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

J'ai essayé beaucoup de choses, mais je ne pouvais pas trouver le problème.

Était-ce utile?

La solution

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 fonctionner. 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);
}

Autres conseils

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

EDIT: Pour élaborer, getline devrait être mise au rancart nouvelle ligne. Peut-être l'encodage de votre nouvelle ligne de mauvais fichier (à savoir windows vs unix).

Votre principal problème est le répertoire de travail.
Parce que vous spécifiez un fichier en utilisant un chemin relatif, il recherche le fichier à partir du répertoire de travail courant. Le répertoire de travail peut être spécifié par votre environnement de dev. (Remarque: Le répertoire de travail est pas nécessairement le même répertoire où la vie exécutables (cette hypothèse est courante chez les débutants, mais ne tient que dans des circonstances très particulières))

.

Bien que vous avez une fin spéciale de marqueur d'entrée « 0 », vous devriez également vérifier que le getline () ne parvient pas (comme il pourrait l'erreur pour d'autres raisons (y compris l'entrée au format Beady). En tant que tel il est généralement préférable 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top