Bonjour,
Nous observons un comportement différent au niveau d'un programme écrit en C/C++ entre une compilation GCC sous windows (mingw / codeblock) et GCC linux (codeblock).
En fait, pour lire dans un fichier une ligne,
- nous ouvrons un flux sur le fichier à l'aide de :
- nous déclarons un buffer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::ifstream fin; //déclaration fin.open(filename); //ouverture du flux
- Nous lisons chaque ligne du fichier à l'aide de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char buf[MAX_LINE_LENGTH];
- Pour pouvoir travailler avec les fonctions de la bibliothèque C++ <string>, nous convertissons ce buffer en std::string :
Code : Sélectionner tout - Visualiser dans une fenêtre à part fin.getline(buf,MAX_LINE_LENGTH); //lecture
- Ensuite, pour savoir si on est face à une ligne vide, nous utilisons :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::string str; str = buf;
C 'est ici que tout se gâte! D'une part, sous linux, la fonction strlen n'est pas incluse dans string. Il faut donc rajouter cstring.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if( strlen(str) == 0 ){ //... }
Une fois rajoutée, le résultat est complètement différent de sous windows. Il semble qu'il y ait deux solutions possibles :
- Soit "getline" supprime seule sous windows \r\n ou \n (std::endl d'un autre programme C++)
- Soit "strlen" ne prend pas en compte les \r\n ou \n
Quelle est selon vous la cause? Comment corriger ceci "proprement" ?
Partager