Pointer vers ligne aléatoire impaire dans TXT

Bonjour à tous,
je cherche à démarrer la lecture d'un fichier txt sur une ligne aléatoire impaire.
je vous livre ici mon code en grande partie codé par (encore merci Kamill) :

void loop() {
  fichierSD = SD.open("test.txt");
  static int ligne = 0;
  int a;

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

    if (c == "\n")
    {
      ligne = (ligne + 1) % 2; // nouvelle ligne
      if (ligne == 0)
        delay(7000);
      if (ligne == 0)
        display.clearDisplay();
      else
        ligne = (ligne * 15);
      display.setTextSize( 2 );
      display.setCursor(0, ligne);
    }
    else
    {
      display.setTextSize( ligne / 7 );
      display.setTextColor( WHITE );
      display.print(c);
      display.display();

    }
  }
}

J'ai un bout de code qui donne un nombre aléatoire jusqu'à 300...

#include <Event.h>
#include <Timer.h>

long randNumber; 

void setup(){
  Serial.begin(9600); 
  randomSeed(analogRead(0));
}

void loop() {
  
  display.setTextSize( 1 );
  display.setTextColor( WHITE );
  randNumber = random(300);
  display.print(randNumber);
  display.display();
  delay(500);
  display.clearDisplay();
}

Mais je ne crois pas qu'il soit intégrable dans le mien...de plus il ne me donne pas que des nombres impaires....pour cause je ne sais pas faire.

Prenez un nombre aléatoire - s'il est pair (testez modulo 2 == 0) - ajoutez 1 et il sera aléatoire et impair

Merci pour votre réponse J-M-L,
je vais appliquer ""(testez modulo 2 == 0) - ajoutez 1 et il sera aléatoire et impair"".
dés que j'aurai atteint ce stade...

Avant ça, j'ai un problème, je ne sais pas accéder à un numéro de ligne de mon fichier txt.
Pensez-vous que cela est possible avec mon code actuel ?

#include <Adafruit_SSD1306.h> 
#include <SD.h>
File fichierSD;
#define OLED_RESET 4
Adafruit_SSD1306 display( OLED_RESET );

void setup() {
  SD.begin(3);
  display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
  display.clearDisplay();
}
void loop() {
  fichierSD = SD.open("test.txt");
  static int ligne = 0;

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

    if (c == '\n')
    {
      ligne = (ligne + 1) % 2; // nouvelle ligne
      if (ligne == 0)
        delay(3500);
      if (ligne == 0)
        display.clearDisplay();
      else
      delay(2000);
        ligne = (ligne * 15);
      display.setTextSize( 2 );
      display.setCursor(0, ligne);
      
    }
    else
    {
      display.setTextSize( ligne / 7 );
      display.setTextColor( WHITE );
      display.print(c);
      delay(1);
      display.display();
    }
  }
}

Mentalement, je ne modélise pas, en langage C encore moins.
Dois-je créer une variable qui compte les \n ?? je suis beaucoup perdu !
Ps : mon avatar c'est : "En programmation je suis un enfant de 5 ans"

Votre code cherche les '\n' qui sont les marques de fin de ligne - donc oui il suffirait avant le while de générer ce nombre aléatoire impair, puis de compter un certain nombre de marques de fin de ligne et voilà. Faudra gérer le cas où votre nombre aléatoire est après la fin du fichier cependant, saut si vous savez avant combien de lignes max vous avez (calculable en parcourant une fois le fichier avant)

Merci pour votre explication J-M-L,
je reviens vers vous car j'ai mon chiffre aléatoire "randNumber"
mais je ne sais pas compter le nombre de '\n' ,
je ne sais pas non plus démarrer la lecture du fichier txt à la ligne voulue.

void loop() {
  fichierSD = SD.open("test.txt");
  static int ligne = 0;
  randNumber = random(50);
  
  while (fichierSD.available()) {
    char c = fichierSD.read();

    if (c == '\n')
    {
      ligne = (ligne + 1) % 2; // nouvelle ligne
      if (ligne == 0)
        delay(3500);
      if (ligne == 0)
        display.clearDisplay();
      else
      delay(2000);
        ligne = (ligne * 15);
      display.setTextSize( 2 );
      display.setCursor(0, ligne);
      
    }
    else
    {
      display.setTextSize( ligne / 7 );
      display.setTextColor( WHITE );
      display.print(c);
      delay(1);
      display.display();

    }
  }
}

j'ai bien essayé : if (c == '\n' * randNumber) ... mais sans succès.

if (c == '\n' * randNumber) ...

Si le caractère lu est égal a la valeur du caractère "retour à la ligne" multiplié par un nombre aléatoire....

Sérieusement vous pensez que ça va compter les lignes? Un "retour à la ligne" restera toujours un "retour à la ligne" même si c'est le 30eme que vous lisez...Le caractère dans le fichier est le même...

Essayez d'exprimer en français avec des opérations élémentaires ( des tant que, lire un caractère, comparer, ajouter 1, si alors ...) ce que vous voulez faire

Merci à nouveau J-M-L
mais votre réponse dépasse mes compétences.
Quand j'ai posté mon problème, j'étais dans le brouillard, désormais, je suis dans la nuit..
Si je peux réitérer ma demande plus simplement :

-Est-il possible de démarrer la lecture d'un fichier txt
à partir de la ligne n* 13 et de l'afficher sur l'écran oled à la ligne n* 1,
comme le propose mon code. (sauf que celui-ci démarre à la ligne n*1 du fichier txt).

#include <Wire.h>
#include <Event.h>
#include <Timer.h>
#include <Adafruit_SSD1306.h>
#include <SD.h>
File fichierSD;
#define OLED_RESET 4
Adafruit_SSD1306 display( OLED_RESET );

void setup() {
  SD.begin(3);
  display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
  randomSeed(analogRead(0));
  display.clearDisplay();
}
void loop() {
  fichierSD = SD.open("test.txt");
  static int ligne = 0;
  int n = 13;                // MA LIGNE DE DEBUT DE LECTURE
  while (fichierSD.available()) {
    char c = fichierSD.read();
    if (c == '\n')
    {
      ligne = (ligne + 1) % 2; // nouvelle ligne
      if (ligne == 0)
        delay(3500);
      if (ligne == 0)
        display.clearDisplay();
      else
        delay(2000);
      ligne = (ligne * 15);
      display.setTextSize( 2 );
      display.setCursor(0, ligne);
    }
    else
    {
      display.setTextSize( ligne / 7 );
      display.setTextColor( WHITE );
      display.print(c);
      delay(1);
      display.display();
    }
  }
}

Si oui, je suis preneur d'une solution (un bout de code voir un emplacement)
Je vais essayer d'avancer par déduction.

-Quand formuler la demande n'est pas simple, comprendre les réponses, les tout autant.

Arriveriez vous écrire une boucle qui compte Le nombre de lignes dans le fichier?

Merci pour le temps passé J-M-L.
pour une boucle qui compte les lignes je pense à ça :

    int i = 0;
    while (i < 13)
{
      char c = fichierSD.read();
      if (c == '\n'); 
   {
        i++;
   }
}

Mais ça ne fonctionne pas du tout.
Non, je ne sais pas.

Vous y êtes presque

Ce que vous écrivez c'est si le caractère lu est le passage la ligne, alors ne rien faire
Incrementez i
Boucler

--> donc vous lisez 13 caracteres et sortez du while

La raison: il y a un ; de trop après le if - si vous pressiez ctrl-T dans l'éditeur pour indenter correctement le code, vous auriez pu voir que l'incrémentation de i n'est pas dans le bloc du if... une bonne raison pour indenter son code...

Bonsoir,
je ctrl-T à tout va, merci J-M-L,
cela contribue à clarifier ma lecture.
En revanche mon écriture patine encore beaucoup..

"" --> donc vous lisez 13 caracteres et sortez du while ""

je pense à ça :

int i = 0;
    while (i < 13)
    {
      char c = fichierSD.read();
      if (c == '\n')
      {
        i++;
        if (i < 13)
        display.clearDisplay();
        
        else
        display.print(c);
      }
    }

mais ça ne colle pas.
Je bute...
Entre la boucle qui gère les '\n',
la lecture du txt et l'affichage à l'écran...
Je suis confus.

If vous faut 2 boucles consécutives

La première qui va 'avaler' les 13 première lignes et qui n'affichera rien - vous avez quasiment le code pour cela si vous virez votre tentative d'affichage du texte

Puis une seconde qui continue lire le fichier une fois passer le 13ème '\n' et qui va afficher tout jusqu'à rencontrer le 15ème '\n' et s'arrêter là (si vous voulez afficher 2 lignes)

Ouvrir le fichier en lecture

nb = 0
Tant que nb < 13
  Lire caractère
  Si caractère == retour à la ligne incrémenter nb
Fin tant que


// ici on a lu 13 retour à la ligne

nb = 0
Tant que nb < 2
  Lire caractère
  Si caractère == retour à la ligne 
      Incrémenter nb
      Si nb == 1 passer à la ligne sur le LCD
  Sinon afficher caractère 
Fin tant que

// ici on a lu 2 lignes

Fermer le fichier

Idéalement il faut aussi tester le cas si vous arrivez la fin du fichier ou erreur de lecture en cours de route car la sortie des "tant que" dépend de si vous trouvez assez de retour à la ligne et donc dans ce cas vous seriez dans une boucle infinie

Merci J-M-L,
le jeton est tombé.

Vos recommandations sur ce post ont fait office de cours particulier.

Bien à vous.

Dany