Getline to Ssortingng Copie également newline

Je lis un fichier ligne par ligne et ajoute chaque ligne à une chaîne. Cependant, la longueur de la chaîne augmente de 1 pour chaque ligne, ce qui, selon moi, est dû au caractère de nouvelle ligne. Comment puis-je l’enlever d’être copié.

Voici ma tentative de code pour faire la même chose.

if (inputFile.is_open()) { { ssortingng currentLine; while (!inputFile.eof()) while( getline( inputFile, currentLine ) ) { ssortingng s1=currentLine; cout<<s1.length(); } 

[Description mise à jour] j’ai utilisé notepad ++ pour déterminer la longueur de ce que je sélectionne ligne par ligne. Donc, ils montrent quelque 123, 450, 500, 120 pour lesquels mon programme montre 124,451,501,120. À l’exception de la dernière ligne, tout line.length () affiche une valeur augmentée de 1.

Il semble que inputFile ait des inputFile ligne de style Windows (CRLF), mais votre programme scinde l’entrée sur des sauts de ligne de type Unix, car std::getline() , le \n par défaut, laissant le CR ( \r ) à la fin de votre chaîne.

Vous aurez besoin de couper les étrangers \r s. Voici une façon de le faire, avec un petit test:

 #include  #include  #include  void remove_carriage_return(std::ssortingng& line) { if (*line.rbegin() == '\r') { line.erase(line.length() - 1); } } void find_line_lengths(std::istream& inputFile, std::ostream& output) { std::ssortingng currentLine; while (std::getline(inputFile, currentLine)) { remove_carriage_return(currentLine); output << "The current line is " << currentLine.length() << " characters long and ends with '0x" << std::setw(2) << std::setfill('0') << std::hex << static_cast(*currentLine.rbegin()) << "'" << std::endl; } } int main() { std::istringstream test_data( "\n" "1\n" "12\n" "123\n" "\r\n" "1\r\n" "12\r\n" "123\r\n" ); find_line_lengths(test_data, std::cout); } 

Sortie:

 The current line is 0 characters long and ends with '0x00' The current line is 1 characters long and ends with '0x31' The current line is 2 characters long and ends with '0x32' The current line is 3 characters long and ends with '0x33' The current line is 0 characters long and ends with '0x00' The current line is 1 characters long and ends with '0x31' The current line is 2 characters long and ends with '0x32' The current line is 3 characters long and ends with '0x33' 

Choses à noter:

  • Vous n'avez pas besoin de tester EOF. std::getline() retournera le stream, qui utilisera false s'il ne peut plus lire depuis inputFile .
  • Vous n'avez pas besoin de copier une chaîne pour déterminer sa longueur.

C’est parce que vous êtes sous MS-Windows et qu’ils ajoutent un “\ r” avant le “\ n” et que “\ r” n’est pas supprimé.