J'ai remarqué un comportement étrange lors de la lecture d'un fichier par ligne. Si le fichier se termine par \n
(ligne vide), il peut être ignoré ... mais pas toujours, et je ne vois pas ce qui le fait sauter ou non.Comment std :: getline décide-t-il d'ignorer la dernière ligne vide?
j'ai écrit cette petite division de la fonction d'une chaîne en lignes pour reproduire le problème facilement:
std::vector<std::string> SplitLines(const std::string& inputStr)
{
std::vector<std::string> lines;
std::stringstream str;
str << inputStr;
std::string sContent;
while (std::getline(str, sContent))
{
lines.push_back(sContent);
}
return lines;
}
Quand je le tester (http://cpp.sh/72dgw), je reçois ces sorties:
(1) "a\nb" was splitted to 2 line(s):"a" "b"
(2) "a" was splitted to 1 line(s):"a"
(3) "" was splitted to 0 line(s):
(4) "\n" was splitted to 1 line(s):""
(5) "\n\n" was splitted to 2 line(s):"" ""
(6) "\nb\n" was splitted to 2 line(s):"" "b"
(7) "a\nb\n" was splitted to 2 line(s):"a" "b"
(8) "a\nb\n\n" was splitted to 3 line(s):"a" "b" ""
donc dernier \n
est sauté pour le cas (6), (7) et (8), très bien. Mais pourquoi ce n'est pas pour (4) et (5) alors?
Quelle est la raison derrière ce comportement?