2010-03-08 3 views
0

J'ai un fichier texte en 3 lignes:Les chaînes de caractères ne fonctionnent pas comme prévu avec newline et itérateurs? (C++)

Line 1 

Line 3 

(ligne 1, une ligne blanche, et la ligne 3)

vector<string> text; 
vector<string>::iterator it; 
ifstream file("test.txt"); 
string str; 

while (getline(file, str)) 
{ 
    if (str.length() == 0) 
    str = "\n"; 
    // since getline discards the newline character, replacing blank strings with newline 

    text.push_back(str); 
} // while 

for (it=text.begin(); it < text.end(); it++) 
    cout << (*it); 

Imprime:

Line 1 
Line 3 

Je ne suis pas sûr pourquoi la chaîne avec seulement un saut de ligne n'a pas été imprimée. Toute aide serait appréciée. Merci.

+0

Andrey était correcte, j'avais tout simplement une autre erreur dans mon code qui faisait croire que les itérateurs ne travaillaient pas avec les nouvelles lignes – kevin

Répondre

4

N'était pas? En fait, c'était! La raison pour laquelle vous avez une nouvelle ligne après Line 1 est exactement cette chaîne vide avec newline dedans et rien d'autre. Si ce n'est pas pour cette deuxième ligne, vous verrez Line 1Line 3 en sortie. (Vous avez dit vous-même. getline défausse sauts de ligne)

Apparemment, la façon dont je comprends votre intention, vous étiez censé mettre en oeuvre votre cycle de sortie comme suit

for (it = text.begin(); it < text.end(); it++) 
    cout << *it << endl; 

De cette façon, vous ajoutez un saut de ligne après chaîne pendant la sortie. Mais si c'est le cas, vous n'avez pas besoin d'ajouter manuellement un caractère \n pour vider les chaînes pendant la lecture. En d'autres termes, décidez ce que vous voulez faire. Pour le moment, ce n'est pas clair.

  • Si vous souhaitez restaurer les mis au rebut lors de la lecture des sauts de ligne, vous devez faire pour toutes lignes, pas seulement pour ceux qui sont vides.

  • Si vous voulez ajouter la nouvelle ligne caractères lors de la sortie, vous ne besoin de les pousser à tout dans explictly les lignes de lecture .

En fait, c'est une idée plutôt étrange de pousser littéralement les caractères de nouvelle ligne dans vos chaînes. Pourquoi? Puisque vous avez déjà lu et stocké votre texte ligne par ligne, les caractères de nouvelle ligne peuvent être implicite. C'est à dire. vous pouvez faire l'impression comme je le fais ci-dessus (avec endl), et tout ira comme prévu.

+0

J'ai mal compris ce que j'écrivais alors. Ce code est un extrait de côté, je vais essayer d'écrire ce que j'essaie de faire. – kevin

1

j'utiliser quelque chose comme ceci:

std::vector<std::string> text; 
std::string str; 

while (std::getline(infile, str)) 
    text.push_back(str); 

std::copy(text.begin(), text.end(), 
    std::ostream_iterator<std::string>(std::cout, "\n")); 

Vous ajoutez la complexité qui arrête votre code de travail.

2

Je pense que la réponse simple ici est que getline() supprime la nouvelle ligne de fin, qu'il y ait ou non du contenu dans la chaîne.Donc, les trois que vous lit ne sont les suivants:

"Line 1" 
"" 
"Line 3" 

que vous transformez en:

"Line 1" 
"\n" 
"Line 3" 

qui, lorsqu'il est imprimé est:

Line 1 
Line 3