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?
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);
}