Frage

eine weitere Anforderung sorry .. Im Moment lese ich die Zeichen in einer nach dem anderen und es funktioniert, aber ich möchte wissen, wenn es eine neue Linie ist ..

, wenn meine Datei enthält

Hey Bob
Now

sollte gib mir

Hey
Bob
[NEW LINE]
NOW

Gibt es eine Möglichkeit, dies zu tun, ohne getline mit?

War es hilfreich?

Lösung

Ja der Operator >>, wenn sie mit Zeichenfolge lesen ‚white space‘ verwendet getrennte Wörter. A ‚White Raum‘ umfasst Raum Registerkarte und neue Zeilen Zeichen.

Wenn Sie eine Zeile zu einem Zeitpunkt Verwendung std :: getline lesen ()
Die Linie kann dann mit einem String-Stream Token aufgeteilt getrennt werden.

std::string   line;
while(std::getline(std::cin,line))
{

    // If you then want to tokenize the line use a string stream:

    std::stringstream lineStream(line);
    std::string token;
    while(lineStream >> token)
    {
        std::cout << "Token(" << token << ")\n";
    }

    std::cout << "New Line Detected\n";
}

Kleine Ergänzung:

Ohne Verwendung getline ()

So Sie wirklich in der Lage sein wollen, eine neue Zeile zu erkennen. Das bedeutet, dass Newline eine andere Art von Token wird. So lässt vermuten, dass Sie Wörter von ‚weißen Flecken‘ als Zeichen und Newline als seine eigene Token getrennt haben.

Dann können Sie einen Token-Typen erstellen.
Dann alles, was Sie tun müssen, ist den Stream-Betreiber für ein Token schreiben:

#include <iostream>
#include <fstream>

class Token
{
    private:
        friend std::ostream& operator<<(std::ostream&,Token const&);
        friend std::istream& operator>>(std::istream&,Token&);
        std::string     value;
};
std::istream& operator>>(std::istream& str,Token& data)
{
    // Check to make sure the stream is OK.
    if (!str)
    {   return str;
    }

    char    x;
    // Drop leading space
    do
    {
        x = str.get();
    }
    while(str && isspace(x) && (x != '\n'));

    // If the stream is done. exit now.
    if (!str)
    {
        return str;
    }

    // We have skipped all white space up to the
    // start of the first token. We can now modify data.
    data.value  ="";

    // If the token is a '\n' We are finished.
    if (x == '\n')
    {   data.value  = "\n";
        return str;
    }

    // Otherwise read the next token in.
    str.unget();
    str >> data.value;

    return str;
}
std::ostream& operator<<(std::ostream& str,Token const& data)
{
    return str << data.value;
}


int main()
{
    std::ifstream   f("PLOP");
    Token   x;

    while(f >> x)
    {
        std::cout << "Token(" << x << ")\n";
    }
}

Andere Tipps

Ich weiß nicht, warum Sie denken, std::getline schlecht ist. Sie können immer noch neue Zeilen erkennen.

std::string token;
std::ifstream file("file.txt");
while(std::getline(file, token)) {
    std::istringstream line(token);
    while(line >> token) {
        std::cout << "Token :" << token << std::endl;
    }
    if(file.unget().get() == '\n') {
        std::cout << "newline found" << std::endl;
    }
}

Dies ist ein weiterer kühl und viel weniger ausführlich, wie ich über kam Saiten tokenize.

vector<string> vec; //we'll put all of the tokens in here 
string token;
istringstream iss("put text here"); 

while ( getline(iss, token, '\n') ) {
       vec.push_back(token);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top