Hello,
Parcer for a configuration file, I realized the example
For "integer" is OK, but I can not get "char" with "strncpy", can you please help me?
pi:
- With "Serial.println (value)" in each "if" it OK.
- My problem it's with "strncpy" for manage "char"
Thank you for uour help!
Serial result:
box_name = BOX_000127/10/2013 22:50:2
box_conf_update = 27/10/2013 22:50:2
fichier .conf
# Preferences
box_name = BOX_0001
box_conf_update = 27/10/2013 22:50:2
Code:
void boxIni()
{
/* Déclare le buffer qui stockera une ligne du fichier, ainsi que les deux pointeurs key et value */
char buffer[BUFFER_SIZE], *key, *value;
/* Déclare l'itérateur et le compteur de lignes */
byte i, buffer_lenght, line_counter = 0;
// Preferences
char box_name[9];
char box_conf_update[19];
// Open file
File config_file = SD.open(fileNameInit, FILE_READ);
if(!config_file) { // Gère les erreurs
Serial.println("Pas de fichier");
}
/* Tant que non fin de fichier */
while(config_file.available() > 0 ){
/* Récupère une ligne entière dans le buffer */
i = 0;
while((buffer[i++] = config_file.read()) != '\n') {
/* Si la ligne dépasse la taille du buffer */
if(i == BUFFER_SIZE) {
/* On finit de lire la ligne mais sans stocker les données */
while(config_file.read() != '\n');
break; // Et on arrête la lecture de cette ligne
}
}
/* On garde de côté le nombre de char stocké dans le buffer */
buffer_lenght = i;
/* Gestion des lignes trop grande */
if(i == BUFFER_SIZE) {
Serial.print("Ligne trop longue à la ligne ");
Serial.println(line_counter, DEC);
}
/* Finalise la chaine de caractéres ASCIIZ en supprimant le \n au passage */
buffer[--i] = '\0';
/* Incrémente le compteur de lignes */
++line_counter;
/* Ignore les lignes vides ou les lignes de commentaires */
if(buffer[0] == '\0' || buffer[0] == '#') continue;
/* Cherche l'emplacement de la clef en ignorant les espaces et les tabulations en début de ligne */
i = 0;
while(buffer[i] == ' ' || buffer[i] == '\t') {
if(++i == buffer_lenght) break; // Ignore les lignes contenant uniquement des espaces et/ou des tabulations
}
if(i == buffer_lenght) continue; // Gère les lignes contenant uniquement des espaces et/ou des tabulations
key = &buffer[i];
/* Cherche l'emplacement du séparateur = en ignorant les espaces et les tabulations âpres la clef */
while(buffer[i] != '=') {
/* Ignore les espaces et les tabulations */
if(buffer[i] == ' ' || buffer[i] == '\t') buffer[i] = '\0';
if(++i == buffer_lenght) {
Serial.print("Ligne mal forme a la ligne ");
Serial.println(line_counter, DEC);
break; // Ignore les lignes mal formé
}
}
if(i == buffer_lenght) continue; // Gère les lignes mal formé
/* Transforme le séparateur = en \0 et continue */
buffer[i++] = '\0';
/* Cherche l'emplacement de la valeur en ignorant les espaces et les tabulations âpres le séparateur */
while(buffer[i] == ' ' || buffer[i] == '\t') {
if(++i == buffer_lenght) {
Serial.print("Ligne mal forme a la ligne ");
Serial.println(line_counter, DEC);
break; // Ignore les lignes mal formé
}
}
if(i == buffer_lenght) continue; // Gère les lignes mal formé
value = &buffer[i];
/* Transforme les données texte en valeur utilisable */
/* C'est ce morceaux de code qu'il vous faudra adapter pour votre application */
if(strcmp(key, "box_name") == 0) {
int len = strlen(value);
strncpy (box_name, value, len);
}
else if(strcmp(key, "box_conf_update") == 0) {
int len = strlen(value) ;
strncpy (box_conf_update, value, len);
}
else { // Default
Serial.print("Clef inconnu ");
Serial.println(key);
}
}
/* Ferme le fichier de configuration */
config_file.close();
/* Affiche le résultat de la configuration */
Serial.println("---------------------------------------------------");
Serial.print("box_name = ");
Serial.println(box_name);
Serial.print("box_conf_update = ");
Serial.println(box_conf_update);
} // end boxinit