Frage

Hier ist mein 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 Inhalt:

5 9 2 9 3
8 2 8 2 1
0

In Enclipse, geht es auf unendliche Schleife. Ich bin mit MinGW 5.1.6 + Eclipse-CDT.

Ich habe versucht, viele Dinge, aber ich konnte das Problem nicht finden.

War es hilfreich?

Lösung

Da Sie auf Fenster sind versuchen:

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

Die letzte Zeile wird als "0\r\n" gespeichert. Die \n wird als Zeilentrennzeichen von getline verwendet, um die tatsächliche Linie Lese "0\r"

sein

oder

können Sie die DOS-Format-Datei in UNIX-Format mit dem Befehl konvertieren

dos2unix input.txt

Nun sollte Ihr Original-Programm arbeiten. Der Befehl wird die \r\n am Ende der Linie ändern \n

Auch sollten Sie immer die Fehlerprüfung tun, nachdem Sie versuchen, eine Datei zu öffnen, so etwas wie:

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

Andere Tipps

Es wird eine Endlosschleife erstellen, wenn keine Zeile enthält genau 0. 0\n Zum Beispiel ist nicht das Gleiche wie 0. Meine Vermutung ist, dass das ist Ihr Problem.

EDIT: Um zu erarbeiten, sollte getline die Newline Verwerfen werden. Vielleicht ist das Newline kodiert Ihre Datei falsch (das heißt Fenster vs. Unix).

Ihr Hauptproblem ist das Arbeitsverzeichnis.
Da Sie eine Datei mit einem relativen Pfad angeben es für die Datei aus dem aktuellen Arbeitsverzeichnis durchsucht. Das Arbeitsverzeichnis kann vom Entwickler-Umgebung angegeben werden. . (Hinweis: Das Arbeitsverzeichnis ist nicht unbedingt das gleiche Verzeichnis, in dem sie die ausführbaren Leben (dies ist eine allgemeine Annahme bei Anfängern aber hält nur unter ganz besonderen Umständen))

Auch wenn Sie ein spezielles Eingabeende Markierung „0“ haben überprüfen sollten Sie auch, dass die getline () scheitern nicht (wie es aus anderen Gründen aus Fehlern könnte (einschließlich perlend formatierte Eingang). Als solches ist es in der Regel am besten überprüfen Sie den Zustand der Datei, wie Sie es lesen.

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top