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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
std::ifstream               fin; //déclaration
fin.open(filename);              //ouverture du flux
- nous déclarons un buffer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
char buf[MAX_LINE_LENGTH];
- Nous lisons chaque ligne du fichier à l'aide de :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
fin.getline(buf,MAX_LINE_LENGTH); //lecture
- 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
1
2
std::string str;
str = buf;
- Ensuite, pour savoir si on est face à une ligne vide, nous utilisons :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
if( strlen(str) == 0 ){
//...
}
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.

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" ?