Go Down

Topic: les string me rendent fou ! :) (Read 514 times) previous topic - next topic

fredo5962

Hello

pour répondre à dbrion06.

merci beaucoup de ton aide et de m'éclairer ! j'avais utilisé 12 car lorsque j'utilisais la fonction length sur le string qui contenait le numéro de telephone, il me retournait 12.. donc j'ai pas cherché plus loin :)

effectivement je ne rajoute pas un 0 à la fin... mais pourquoi le faire ?? mon numéro de telephone aura un 0 en plus à la fin et quand j'appelle numero0 ou numero1, je vais me retrouver avec un 0 a la fin qui sert à rien ??
ou alors je dois utiliser à la fin un string du genre ...
numerofinal = numero0[1]+numero0[2]....jusque + numero0[12]

ou alors il y a une solution pour lorsque j'appelle numero0 il me donne tout sauf le 0 de la fin ? concact ?

pour répondre à hbachetti,

merci de ton aide également, en fait le seek me sert à positionner le début de la chaîne que je veux lire, car je ne cherche pas à l'afficher, je cherche à le lire et à le stocker pour l'utiliser ensuite comme numéro de téléphone.

le fichier lu est un fichier on ne peut plus basique créé avec note de Windows ou les numéros sont les uns en dessous des autres....

cela dit... maintenant que tu le dis... s'ils sont les un en dessous des autres.... il y aurait bien un caractère caché qui le dit quelque part... sinon ils seraient les uns a la suite des autres....

numero.txt


+33796000000
+33900000000
etc...


vraiment désolé de vous embêter avec ca.. mais je débute et comme j'apprends tout seul... bref... heureusement que vous êtes la à m'aider !

dbrion06

"effectivement je ne rajoute pas un 0 à la fin... mais pourquoi le faire ??"
Parce que que les tableaux de caractères c DOIVENT se terminer par le charactère de valeur entière 0 (\0), sinon, les fonctions de manipulation -calcul de la longueur, affichage, conversion en string- donnent des résultats bizarres... Comme, à l'initialisation, un tableau de chars peut être rempli de caractères nuls, cette nécessité peut être cachée, donnant l'illusion qu'un bout de code marche... mais il vaut mieux le faire explicitement.
En passant, il ne faut pas confondre un caractère et son équivalent entier; exemple, le caractère 'a' a pour valeur, en entier 97 -en decimal- ou 0x61 -en hexa-; le caractère '9' a pour representation entière 57, 0x39 et le carctère '0' est codé en 48 -0x30-
Code: [Select]

sh-4.1$ python
ordPython 2.7.3 (default, Dec 18 2012, 13:50:09)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
(>>> ord('a')
97
>>> ord('9')
57
>>> ord('0')
48
>>> chr(0x39)
'9'
>>> chr(0x30)
'0'



HBachetti vous indique une piste bien plus prometteuse que le fait de  sauter des caractères cachés (et on ne sait pas comment faire, sans bricoler, pour lire , disons, les 3 derniers numéros de téléphone; avec une lecture plus standard de votre fichier, c'est plus facile.
A noter que si votre fichier a été créé sous windows, il y a 2 caractères cachés pour le changement de ligne : \n -10 - et \r -13  (on les montre généralement comme ça...). Sous linux, il n'y en a qu'un (donc, les fichiers texte crées sous GNUlinux peuvent parfois sembler bizarres à des applications d'un autre système).
Il est vraisemblable (mais encore une fois, sans le fichier, on doit faire des paris) que l'on saute les fins de ligne -qui sont des caractères cachés-. A noter enfin que le filtrage que j'utilise fait un pari sur la liste des caractères valides pour les numéros de téléphone (la démarche de HBachetti est plus rationnelle, même si elle "marche" peut être un peu moins vite au début)

J-M-L

#17
Mar 28, 2019, 08:42 am Last Edit: Mar 28, 2019, 08:43 am by J-M-L
Si les Nos sont sur 2 lignes, Idéalement on devrait lire (avec read) jusqu'au '\n' en ignorant un éventuel '\r' et en filtrant peut-être les caractères non voulus, et ne pas faire d'hypothese Sur la longueur exacte du numéro, juste sur sa taille Max. S'ils sont sur la même ligne il doit y avoir un séparateur et faut lire jusqu'à tomber sur ce séparateur
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

hbachetti

#18
Mar 28, 2019, 11:30 am Last Edit: Mar 28, 2019, 01:09 pm by hbachetti
Quote
merci de ton aide également, en fait le seek me sert à positionner le début de la chaîne que je veux lire, car je ne cherche pas à l'afficher, je cherche à le lire et à le stocker pour l'utiliser ensuite comme numéro de téléphone.
1ère chose avant d'apprendre à coder : apprendre à lire

Quote
Quand tu ouvres un fichier, l'index vaut zéro.
Ensuite tu utilises read(), à chaque caractère lu, l'index s'incrémente, donc au prochain read() tu liras le caractère suivant, automatiquement.
Quote
il y aurait bien un caractère caché qui le dit quelque part... sinon ils seraient les uns a la suite des autres....
Oui, ces caractères sont des retours à la ligne et des retours chariot comme dans un traitement de texte.
Lire exactement 12 caractères dans le fichier, 2 fois de suite, n'est pas la bonne méthode.

Pourquoi ?
Parce que le caractère que tu vas lire en 13è position est un retour à la ligne '\n'.
En 14è position tu auras probablement un retour chariot '\r'.

Il faut lire le fichier jusqu'à la fin :
   si tu rencontres '\n' tu mets un '\0' en bout de chaîne
   si tu rencontres '\r' tu ignores

Quand on lit dans un fichier on vérifie en permanence que l'on n'a pas atteint la fin :

Code: [Select]

    while (myFile.available()) {
      char c = myFile.read();


Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

fredo5962

#19
Mar 28, 2019, 03:22 pm Last Edit: Mar 28, 2019, 03:34 pm by fredo5962
Re,
J'ai beau chercher.. J'ai même fait afficher caractère par caractère... Y a jamais un / suivi d'un N ??!?....

Ensuite j'ai bien compris le read qui avance pas à pas... Donc au pire étant donné que je connais le format des numéros.... Des que je tombe sur un +c'est le début de mon numéro et il est suivi de 11 chiffres.. Et ça ne sera toujours que 11 chiffres ! Ils vont quand mm pas me rajouter des fintes dans mes numéros... Après le reste je l'ignore... Je fais des read dans le vide et j'attends de tomber sur le prochain +...

Je rajouterai un / et un O pour voir... (Mais j'ai bien peur de galèrer à les retirer) avec ça à la fin de mes numéros.. Mais j'avance.. C'est bien ça le principal.. Et ça c'est grâce à vous !. Merciiiiiiii

fdufnews

J'ai beau chercher.. J'ai même fait afficher caractère par caractère... Y a jamais un / suivi d'un N ??!?....
un print n'affiche pas \n. Le \n c'est une manière d'insérer dans une chaîne de caractère le fait que l'on veut faire passer la suite du texte à la ligne suivante. Lorsque le compilateur rencontre \n dans une chaîne de caractères il lui substitue le code ASCII 10. Le code ASCII 10 lorsqu'il est envoyé à une console est interprété comme un saut de ligne.
De même \r, correspond à "return" et il est remplacé par le code ASCII 13 par le compilateur.

Je rajouterai un / et un O pour voir... (Mais j'ai bien peur de galèrer à les retirer) avec ça à la fin de mes numéros.. Mais j'avance.. C'est bien ça le principal.. Et ça c'est grâce à vous !. Merciiiiiiii
\0 (zéro pas O) permet d'encoder dans une chaîne de caractère le code ASCII 0. Ce n'est pas une fantaisie de notre part c'est obligatoire pour que les fonctions de traitement de chaînes de caractères puissent fonctionner correctement. Le code ASCII 0 marque la fin d'une chaîne, c'est ce qui permet par exemple à la méthode length() de connaitre la longueur d'une chaîne de caractères.

hbachetti

Avec un bout de code tu comprendras peut-être mieux :

Code: [Select]

#include <SPI.h>
#if defined ESP32
#include <FS.h>
#endif
#include <SD.h>

#define FILENAME "/numero.txt"

char *str = "+33796000000\n+33900000000\n+33989780000\n+33900333300\n+33900678900\n+33912340000\n";

void setup() {
  Serial.begin(115200);

  Serial.print("Initializing SD card...");

  if (!SD.begin(5)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  if (!SD.exists(FILENAME)) {
    Serial.println("numero.txt missing");
    File myFile = SD.open(FILENAME, FILE_WRITE);
    if (myFile) {
      Serial.print("Writing to numero.txt...");
      myFile.println(str);
      myFile.close();
      Serial.println("done.");
    } else {
      Serial.println("error opening numero.txt");
    }
  }

#define NUMEROS   10
#define LENGTH    13

  if (!SD.exists(FILENAME)) {
    Serial.println("numero.txt missing");
  }
  else {
    Serial.println("Reading numero.txt...");
    char numero[NUMEROS][LENGTH];
    File myFile = SD.open(FILENAME);
    if (myFile) {
      int n = 0, i = 0;
      while (myFile.available()) {
        char c = myFile.read();
        if (c == '\n') {
          if (n < NUMEROS && i < LENGTH) {
            numero[n][i] = '\0';
            Serial.print("numero ");
            Serial.print(n);
            Serial.print(": ");
            Serial.println(numero[n]);
            i = 0;
            n++;
          }
        }
        else if (c != '\r') {
          if (n < NUMEROS && i < LENGTH - 1) {
            numero[n][i++] = c;
          }
        }
      }
      myFile.close();
    } else {
      Serial.println("error opening numero.txt");
    }
  }
}

void loop() {
}


C'est un exemple que j'avais écrit pour un ESP32, mais il se compile sur un ARDUINO.

Le chipSelect est 5. Remplace par 10 pour ton cas.

Il lit 10 lignes dans un fichier. Je l'ai légèrement adapté en remplaçant les noms de variables et le nom du fichier.

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

fredo5962

re,

oui la c'est bon j'ai compris... franchement superbe ce bout de code..c'est vraiment agreable à lire et facile à comprendre ! j'ai compris la logique et maintenant c'est clair dans ma tete..
merci encore pour vous explication.

bonne soirée

hbachetti

Je t'en prie.
On n'est pas toujours aussi généreux.
Ça traînait dans un fond de tiroir.

Ça marche au moins ?

Je n'ai pas essayé sur un ARDUINO, mais seulement sur un ESP32 il y a quelque temps déjà.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up