Surmonter les différences de fin de ligne avec std :: ifstream
Lorsque vous travaillez avec des fichiers texte, les fins de ligne peuvent varier selon les plates-formes, ce qui entraîne une compatibilité potentielle problèmes. Bien que le runtime C gère généralement correctement les fins de ligne, il est crucial d'envisager des scénarios dans lesquels des fichiers texte sont partagés entre plates-formes.
Pour résoudre ce problème, explorons une fonction personnalisée, safeGetline, qui gère de manière transparente les trois fins de ligne courantes. formats (r, n et rn) :
std::istream& safeGetline(std::istream& is, std::string& t) { // Reset the string to be sure t.clear(); // Utilize a sentry object for synchronized stream access std::istream::sentry se(is, true); std::streambuf* sb = is.rdbuf(); while (true) { // Fetch the next character int c = sb->sbumpc(); switch (c) { case '\n': // Encountered a line ending with just \n return is; case '\r': // Possibility of \r\n line ending if (sb->sgetc() == '\n') sb->sbumpc(); return is; case std::streambuf::traits_type::eof(): // End of file reached if (t.empty()) is.setstate(std::ios::eofbit); return is; default: // Append the character to the string t += (char)c; } } }
Cette fonction fonctionne en lisant les caractères un par un du flux à l'aide d'un tampon de flux, ce qui est plus efficace que la lecture de caractères individuels directement à partir du flux d’entrée. Il gère diverses conventions de fin de ligne et prend également en compte la possibilité d'une dernière ligne vide sans saut de ligne.
Pour démontrer l'utilisation de cette fonction, créons un programme de test simple :
int main() { // Specify the path to the text file containing lines with different line endings std::string path = ...; // Open the file for input std::ifstream ifs(path.c_str()); if (!ifs) { std::cout << "Error opening the file." << std::endl; return EXIT_FAILURE; } // Count the number of lines in the file int n = 0; std::string line; while (!safeGetline(ifs, line).eof()) ++n; // Display the count of lines std::cout << "The file contains " << n << " lines." << std::endl; return EXIT_SUCCESS; }
En utilisant la fonction safeGetline, ce programme peut compter avec précision le nombre de lignes dans le fichier texte spécifié, quel que soit le format de fin de ligne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!