Load configuration file from SD (with char)

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
    while((buffer[i++] = config_file.read()) != '\n') {
 
      /* Si la ligne dépasse la taille du buffer */
      if(i == BUFFER_SIZE) {

You should check that there is room in the buffer BEFORE writing to the buffer.

I don't understand why you are trying to re-invent a bunch of standard C string handling functions, like strstr() and strtok(). Just use them.

In any case, I don't see how we can help you with "it doesn't work", without knowing what it does and what you expect it to do differently.