Problème avec string::substr()
Bonjour,
J'ai un code qui lit un fichier inspiré du XML et qui contient une fonction nettoyant ses lignes.
Cette fonction supprime :
- les espaces en trop aux 2 extrémités de la ligne
- un éventuel signe '/' en fin de ligne (après nettoyage des espaces) pour les données de type path de dossiers
Cela fonctionne bien, mais je voudrais utiliser substr à la place de 3 lignes de codes qui construisent la string nettoyée.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| // Suppression d'éventuels espaces en début et fin d'une chaine, et d'un
// éventuel caractère de séparation de path en trop en fin de chaine
string clean(string chaine)
{
int begin = 0;
int end = chaine.size()-1;
if (end >= 0)
{
while (chaine[begin]==' ' && begin<end)
begin++;
while (chaine[end]==' ' && end>begin)
end--;
if (chaine[end] == '/')
end--;
// lignes à supprimer
string returnString;
for (int i=begin; i<=end; i++)
returnString = returnString + chaine[i];
// FIN lignes à supprimer
// alternative avec substr()
// string returnString = chaine.substr(begin,end); // ligne qui plante
cout << returnString << endl;
if (returnString ==" ")
returnString ="";
return returnString;
}
else
return "";
} |
Avec la version substr(), cette fonction génère une erreur de lecture sur les lignes non précédées d'espaces, en n'affichant pas le dernier caractère '>' de ces lignes (lignes 1,5,7,14 ci-dessous), et n'enlève pas le dernier '/' du path s'il en contient un (ligne 9).
Fichier enregistré en UTF-8 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <scan_options>
<
autres balises....
>
</scan_options>
<directories>
<path>
/home/user/dossier testé/
<
autres balises....
>
</path>
</directories> |
Affichage avec le code actuel :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <scan_options>
<
autres balises....
>
</scan_options>
<directories>
<path>
/home/user/dossier testé
<
autres balises....
>
</path>
</directories> |
Affichage avec le code substr() :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <scan_options
<
autres balises....
>
</scan_options
<directories
<path>
/home/user/dossier testé/
<
autres balises....
>
</path>
</directories |
Le fichier lu est en enregistré en UTF-8. Je me suis demandé si là n'était pas le problème, mais en l'enregistrant en latin-1, cela ne change rien pour les lignes sans espace au début ou le problème du '/', avec en plus des problèmes de reconnaissance de caractères sur les chemins de fichiers en caractères accentués...
Un problème dans mon code avec mes variables int begin ou int end?