Vous êtes sur la page 1sur 9

IMPRESSION

Descendre
Pages: [1]
Sujet: comment lire le fichier sd ligne par ligne  (lu 14508 fois)Sujet Précédent - Sujet Suivant
enregistreur



 Débutant
 Messages: 46
 Karma: 0   [ajouter]

comment lire le fichier sd ligne par ligne


25 août 2014 à 09h32
Comment lire un fichier sur sd ligne par ligne.
Dois-je lire le tampon a de l'exemple de 30 caractères, puis vérifier s'il y a un eol. Ou devrais-je lire char
par char et vérifier directement si char est eol?
marco_c

 Les points de karma sont toujours les bienvenus.


 Membre de Faraday
 Messages: 3486

1.
 Karma: 626   [ajouter]
 De grandes choses viennent dans de grands paquets
 https://arduinoplusplus.wordpress.com/

Re: comment lire le fichier sd ligne par ligne


#1
25 août 2014 à 11h07
Je ferais votre deuxième option. La bibliothèque sd sera mise en mémoire tampon pour vous lorsque vous
lirez le fichier.
Bibliothèques Arduino https://github.com/MajicDesigns?tab=Repositories
Parola pour Arduino https://github.com/MajicDesigns/Parola
Blog Arduino ++ https://arduinoplusplus.wordpress.com
fat16lib


 Membre Edison
 Messages: 2206
 Karma: 312   [ajouter]
 Arduino roches

Re: comment lire le fichier sd ligne par ligne


#2
25 août 2014 à 17h51
fgets () dans SdFat lit un fichier par ligne.

Voici un programme de démonstration:


Code: [Sélectionner]

// Demo of fgets function to read lines from a file.


#include <SdFat.h>

// SD chip select pin


const uint8_t chipSelect = SS;

SdFat sd;

SdFile file;

// Maximum line length plus space for zero byte.


const size_t LINE_DIM = 50;
char line[LINE_DIM];
//------------------------------------------------------------------------------
// store error strings in flash memory
#define error(s) sd.errorHalt_P(PSTR(s))
//------------------------------------------------------------------------------
void setup(void) {
  size_t n;
  Serial.begin(9600);
  while (!Serial) {}  // Wait for Leonardo

  Serial.println(F("Type any character to start"));


  while (Serial.read() <= 0) {}
 
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
 
  if (!file.open("TEST.TXT", O_READ)) error("open failed");
 
  int ln = 1;
  while ((n = file.fgets(line, sizeof(line))) > 0) {
      // Print line number.
      Serial.print(ln++);
      Serial.print(": ");
      Serial.print(line);
      if (line[n - 1] != '\n') {
        // Line is too long or last line is missing nl.
        Serial.println(F(" <-- missing nl"));
      }
  }
  Serial.println(F("\nDone"));
}
void loop(void) {}

Voici le fichier de test sans caractère nl après la dernière ligne.


Citation

Lignes pour tester les fgets.


Ces lignes doivent être
plus courtes que la taille de la mémoire tampon.
La dernière ligne peut manquer une nouvelle ligne.
Caractère de nouvelle ligne manquant

Voici la sortie:
Citation

Tapez n'importe quel caractère pour commencer


1: Lignes pour tester les objets.
2:
3: Ces lignes doivent être
4: plus courtes que la taille de la mémoire tampon.
5: La dernière ligne peut manquer une nouvelle ligne.
6: Caractère de nouvelle ligne manquant <- nl manquant

Terminé

enregistreur



 Débutant
 Messages: 46
 Karma: 0   [ajouter]

Re: comment lire le fichier sd ligne par ligne


#3
26 août 2014 à 13h10
Merci, fat16lib,
je vais essayer d'implémenter ce code, dans mon programma.
enregistreur


 Débutant
 Messages: 46
 Karma: 0   [ajouter]

Re: comment lire le fichier sd ligne par ligne


#4
26 août 2014, 22h38 Dernière édition : 26 août 2014, 23h32 par logger  Raison : 1
Salut fat16lib

ai-je besoin de <SdFat.h>, est-ce pour fgets?


où est cette ligne pour la préformance de vitesse?
Code: [Sélectionner]
 if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

à cette ligne, le fichier est un type de SdFile 


Code: [Sélectionner]
while ((n = file.fgets(line, sizeof(line))) > 0)

mais mon fichier est de type File donc j'obtiens une


erreur: 'class File' n'a pas de membre nommé 'fgets'
fat16lib


 Membre Edison
 Messages: 2206
 Karma: 312   [ajouter]
 Arduino roches

Re: comment lire le fichier sd ligne par ligne


#5
27 août 2014 à 03h12
Il semble que vous utilisez SD.h. SD.h est un wrapper pour une ancienne version de SdFat et manque de
nombreuses fonctionnalités dans les versions modernes de SdFat, vous ne pouvez donc pas utiliser fgets
().
PaulS
 Invité

Re: comment lire le fichier sd ligne par ligne


#6
27 août 2014 à 13h03
Citation
Il semble que vous utilisez SD.h. SD.h est un wrapper pour une ancienne version de SdFat et manque de nombreuses
fonctionnalités dans les versions modernes de SdFat, vous ne pouvez donc pas utiliser fgets ().

Cependant, rien ne vous empêche d'implémenter votre propre version de fgets (), maintenant que vous
avez été frappé par un indice par 4.
enregistreur



 Débutant
 Messages: 46
 Karma: 0   [ajouter]

Re: comment lire le fichier sd ligne par ligne


#7
27 août 2014, 21h59 Dernière édition : 27 août 2014, 22h04 par logger  Raison : 1
Oui j'utilise SD.h
mais comment dois-je alors lire le fichier SD?

Code: [Sélectionner]
 void SendLogFile()
 {
 
   int stringIndex = 0;
   char inputString[BUF_DIM];
   char inputChar;
     
    sprintf(directory,"%04d",year());          
    sprintf(fileName,"%02d%02d%02d_%01d.csv",year()%100,month(),day(),fileCounter);
    sprintf(fullName, "%s/%s", directory, fileName);            
    if (SD.exists(fullName))
    {
     logFile = SD.open(fullName);
         
     if (logFile)
     {
      inputChar = logFile.read(); //get one byte from file
   
      while (inputChar != 'eof') // if char not  eol
      {
     
       if (inputChar != '\n') // if char not  eol
       {
         inputString[stringIndex] = inputChar; //store it
         stringIndex++; // increment where to write next
       }
       else
       {
         mailClient << inputString << endl;  // print de eerste tot de i de
character uit
         stringIndex=0; //clear value for next line
       }
       inputChar = logFile.read(); //get one byte from file
      }
     }
   }
 }

est-ce ainsi? ou y a-t-il un moyen meilleur / plus rapide


PaulS
 Invité

Re: comment lire le fichier sd ligne par ligne


#8
28 août 2014 à 14h49
Code: [Sélectionner]
       while (inputChar != 'eof') // if char not  eol
Les guillemets simples correspondent aux caractères simples. Veuillez publier une photo de votre clavier,
avec la touche ONE sur laquelle vous avez appuyé pour obtenir ce caractère dans les guillemets simples.

L'opérateur ostream attend un tableau de caractères terminé par NULL. Votre tableau de caractères n'est
PAS terminé par null. Répare ça!
enregistreur



 Débutant
 Messages: 46
 Karma: 0   [ajouter]

Re: comment lire le fichier sd ligne par ligne


#9
28 août 2014 à 21h44
Désolé, je ne suis pas habitué à programmer, essayez principalement et erreur.
J'utilise un clavier qwerty standard.

Mes experts opérateurs ostream null?, Pourriez-vous m'aider avec ça


PaulS
 Invité

Re: comment lire le fichier sd ligne par ligne


#dix
29 août 2014 à 12h54
Citation
Mes experts opérateurs ostream null?, Pourriez-vous m'aider avec ça

Regardez votre phrase. Comparez-le au mien.

Où suis-je censé arrêter de lire? L'endroit où vous devez arrêter la lecture est indiqué par un point ou un
point d'interrogation à la fin de chaque phrase.

Les fonctions qui opèrent sur des chaînes, qui ne sont rien de plus que des tableaux de caractères, doivent
savoir quand arrêter le traitement des données du tableau. Ils doivent le savoir car ils ne peuvent PAS
déterminer la taille du tableau ET la taille du tableau n'est pas une indication de la quantité de données
utiles dans le tableau.

Ils savent où arrêter le traitement des données car ils trouvent le «signe de ponctuation» approprié. Dans le
cas des chaînes C, ce "signe de ponctuation" est un NULL (qui est un mot fantaisie pour zéro).
          inputString [stringIndex] = inputChar; //le ranger
          stringIndex ++; // incrémenter où écrire le prochain
          inputString [stringIndex] = '\ 0'; // ajoute un NULL

Code: [Sélectionner]
       while (inputChar != 'eof') // if char not  eol
devrait être:
Code: [Sélectionner]
       while (inputChar != -1)
et le type de inputChar doit être int, pas char.

La fonction read () renvoie -1 lorsqu'il n'y a rien (plus) à lire.


enregistreur



 Débutant
 Messages: 46
 Karma: 0   [ajouter]

Re: comment lire le fichier sd ligne par ligne


# 11
29 août 2014 à 23h40
Merci PaulS
Je ne comprends toujours pas totalement comment cela fonctionne, mais je vais implémenter vos lignes
dans le code

IMPRESSION
Monter
Pages: [1]

Vous aimerez peut-être aussi