Lire un fichier avec un Shield micro SD en C

Bonjour,

Je rencontre un petit problème au niveau de la lecture d'un fichier en C. J'ai réalisé un programme en C, mais je ne peux utiliser la librairie SD.h pour lire un fichier car celui ci est principalement destiné pour les programmes C++.

J'ai également essayé de mélanger le C++ et le C comme nous le permet la GNU toolchain (avec GCC) mais ça c'est mal fini j'ai eu beaucoup d'erreur.

Auriez-vous une autre alternative ?

Merci pour vos réponse

Comme ça c'est compliqué de ton conseiller, on ne sait pas quel problème tu rencontre, quel toolschain tu utilises, celle livrée avec l'IDE Arduino utilisant le C++.
Ni pourquoi tu veux absolument faire uniquement du C.

Déjà si tu donnais ton code et les erreurs que tu reçois, ça serait un bon début.

vous avez un exemple avec la bibliothèque SD qui fait de la lecture et écriture

Je te résume un peu, mon but est d'embarquer un programme C déjà programmé. Or sur ce programme j'utilise fopen pour ouvrir un fichier hors nous nous pouvons pas ouvrir un fichier avec fopen sur un arduino. Donc j'ai voulu utiliser la librairie SD.h mais c'est une libraire utilisable uniquement en C++. C'est pour ça que j'ai essayé de chercher une alternative mais je ne trouves pas.

Information concernant ta question : Oui je suis sous l'IDE Arduino

si tu es sur l'IDE Arduino dans ce cas tu n'es pas en C, mais en C++.
Je vais donc me répéter, quel est ton code et les erreurs que tu reçois.

Sans ça cela sera difficile de bien comprendre et que quelqu'un puisse pleinement t'aider.

Oui c'est vrai mais avec l'IDE Arduino si je me trompes pas on peut coder en C et en C++.

voici l'erreur : <artificial>:(.text.startup+0x2b0): undefined reference to fopen'`

On peut mixer C et C++. Ton problème, me semble plutôt être causé par un mix entre du C posix et l'utilisation de la chaîne Arduino
Ici la doc de la librairie SD

Tu verras qu'il y a open() ça doit pas être trop difficile d’ôter un f et de regarder si ça colle.

Donc tu n'a aucun problème en C et C++.
comme l'indique @fdufnews ton problème est simplement que la fonction fopen, n'existe pas.
Donc soit tu modifie ton programme pour utiliser une fonction d'accès fichier qui existe, soit tu veux absolument garder ton code tel quel, tu crée un fichier cpp, qui redéfinie la fonction fopen en utilisant les librairies disponible sur Arduino.

Oui, il faut utiliser SD.open() au lieu de fopen().

Mais comme je vous le dis la librairie SD.h me pose problème car lorsque je fais un SD.open() j'ai plein d'erreur sur la librairie qui me semble très bizarre.

C'est pour ca je suis venu ici pour voir s'il y a une alternative à ça.

OK, mais on a pas de boule de cristal.
Alors fais un effort pour donner TOUTES LES INFOS pour que l'on puisse t'aider.

Ba l'alternative en fait c'est de faire fonctionner cette librairie qui n'a aucune raison de ne pas marcher.
Même si on pouvait te proposer une autre librairie, comme on ne connais pas ton problème, il y a de forte chance que tu te retrouve avec le même soucis.
Après si tu veux une alternative, c'est de refaire ce que fait la librairie, c'est assez simple, il faut envoyer les bonnes commandes I2C au module.
Mais franchement c'est quand même beaucoup plus simple de faire un copier/coller de tes erreurs non?

C'est marrant tu n'es pas le seul, a demander de l'aide, mais à avoir une idée très précise de la réponse que l'on doit te faire et des informations que l'on a besoin pour y répondre.

Vous voulez utiliser du code qui dépend d’un OS et de drivers etc… sur Arduino vous êtes plus proche du hardware c’est pour cela qu’il vous faut faire votre code avec la bibliothèque SD (ou mieux SdFat).

Son soucis, c'est qu'il pense que comme la librairie SD est écrite en C++, il ne peut pas l'utiliser dans son code C.
Du coup, il ne prend pas la peine de poster ses erreurs de compilations, et cherche une autre façon de faire.

J'ai des erreur dans la librairie la librairie ne compile pas. Mais avec cette meme librairie j'arrive a faire un programme en full C++.

.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:147:26: note: (near initialization for 'digitalPinMap[69]')
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:461:71: error: 'pin_map_t' undeclared here (not in a function)
 static const uint8_t digitalPinCount = sizeof(digitalPinMap) / sizeof(pin_map_t);
                                                                       ^~~~~~~~~
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h: In function 'getPinMode':
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:469:32: error: request for member 'ddr' in something not a structure or union
     return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
                                ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:469:58: error: request for member 'bit' in something not a structure or union
     return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
                                                          ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h: In function 'setPinMode':
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:478:26: error: request for member 'ddr' in something not a structure or union
       *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
                          ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:478:57: error: request for member 'bit' in something not a structure or union
       *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
                                                         ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:480:26: error: request for member 'ddr' in something not a structure or union
       *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
                          ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:480:59: error: request for member 'bit' in something not a structure or union
       *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
                                                           ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h: In function 'fastDigitalRead':
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:489:32: error: request for member 'pin' in something not a structure or union
     return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
                                ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:489:58: error: request for member 'bit' in something not a structure or union
     return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
                                                          ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h: In function 'fastDigitalWrite':
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:498:26: error: request for member 'port' in something not a structure or union
       *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
                          ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:498:58: error: request for member 'bit' in something not a structure or union
       *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
                                                          ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:500:26: error: request for member 'port' in something not a structure or union
       *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
                          ^
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2PinMap.h:500:60: error: request for member 'bit' in something not a structure or union
       *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
                                                            ^
In file included from .pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:29:0,
                 from .pio/libdeps/megaatmega2560/SD/src/SD.h:20,
                 from src/CoSIO.c:6:
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2Card.h: At top level:
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2Card.h:70:41: error: initializer element is not constant
     uint8_t const  SD_CHIP_SELECT_PIN = SS;
                                         ^~
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2Card.h:79:35: error: initializer element is not constant
     uint8_t const  SPI_MOSI_PIN = MOSI;
                                   ^~~~
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2Card.h:81:35: error: initializer element is not constant
     uint8_t const  SPI_MISO_PIN = MISO;
                                   ^~~~
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2Card.h:83:34: error: initializer element is not constant
     uint8_t const  SPI_SCK_PIN = SCK;
                                  ^~~
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2Card.h:176:1: error: unknown type name 'class'; did you mean 'labs'?
 class Sd2Card {
 ^~~~~
 labs
.pio/libdeps/megaatmega2560/SD/src/utility/Sd2Card.h:176:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 class Sd2Card {
               ^
In file included from .pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:30:0,
                 from .pio/libdeps/megaatmega2560/SD/src/SD.h:20,
                 from src/CoSIO.c:6:
.pio/libdeps/megaatmega2560/SD/src/utility/FatStructs.h:405:40: error: initializer element is not constant
 uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY);
                                        ^
In file included from /Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/cores/arduino/Print.h:27:0,
                 from .pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:31,
                 from .pio/libdeps/megaatmega2560/SD/src/SD.h:20,
                 from src/CoSIO.c:6:
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/cores/arduino/Printable.h:25:1: error: unknown type name 'class'; did you mean 'labs'?
 class Print;
 ^~~~~
 labs
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/cores/arduino/Printable.h:33:1: error: unknown type name 'class'; did you mean 'labs'?
 class Printable
 ^~~~~
 labs
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/cores/arduino/Printable.h:34:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 {
 ^
In file included from .pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:31:0,
                 from .pio/libdeps/megaatmega2560/SD/src/SD.h:20,
                 from src/CoSIO.c:6:
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/cores/arduino/Print.h:37:1: error: unknown type name 'class'; did you mean 'labs'?
 class Print
 ^~~~~
 labs
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/cores/arduino/Print.h:38:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 {
 ^
In file included from .pio/libdeps/megaatmega2560/SD/src/SD.h:20:0,
                 from src/CoSIO.c:6:
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:39:1: error: unknown type name 'class'; did you mean 'labs'?
 class SdVolume;
 ^~~~~
 labs
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:69:26: error: initializer element is not constant
 uint8_t const O_RDONLY = O_READ;
                          ^~~~~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:73:26: error: initializer element is not constant
 uint8_t const O_WRONLY = O_WRITE;
                          ^~~~~~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:75:24: error: initializer element is not constant
 uint8_t const O_RDWR = (O_READ | O_WRITE);
                        ^
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:77:27: error: initializer element is not constant
 uint8_t const O_ACCMODE = (O_READ | O_WRITE);
                           ^
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:108:39: error: initializer element is not constant
 uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16;
                                       ^~~~~~~~~~~~~~~~~~~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:151:1: error: unknown type name 'class'; did you mean 'labs'?
 class SdFile : public Print {
 ^~~~~
 labs
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:151:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
 class SdFile : public Print {
              ^
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:482:1: error: unknown type name 'class'; did you mean 'labs'?
 class SdVolume {
 ^~~~~
 labs
.pio/libdeps/megaatmega2560/SD/src/utility/SdFat.h:482:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 class SdVolume {
                ^
In file included from .pio/libdeps/megaatmega2560/SD/src/SD.h:21:0,
                 from src/CoSIO.c:6:
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h: In function 'FreeRam':
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:43:7: error: 'reinterpret_cast' undeclared (first use in this function)
   if (reinterpret_cast<int>(__brkval) == 0) {
       ^~~~~~~~~~~~~~~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:43:7: note: each undeclared identifier is reported only once for each function it appears in
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:43:24: error: expected expression before 'int'
   if (reinterpret_cast<int>(__brkval) == 0) {
                        ^~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:45:36: error: expected expression before 'int'
     free_memory = reinterpret_cast<int>(&free_memory)
                                    ^~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:49:36: error: expected expression before 'int'
     free_memory = reinterpret_cast<int>(&free_memory)
                                    ^~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:41:15: warning: unused variable '__brkval' [-Wunused-variable]
   extern int* __brkval;
               ^~~~~~~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:40:15: warning: unused variable '__bss_end' [-Wunused-variable]
   extern int  __bss_end;
               ^~~~~~~~~
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h: In function 'SerialPrint_P':
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:63:5: error: 'Serial' undeclared (first use in this function); did you mean 'ceil'?
     Serial.write(c);
     ^~~~~~
     ceil
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h: In function 'SerialPrintln_P':
.pio/libdeps/megaatmega2560/SD/src/utility/SdFatUtil.h:74:3: error: 'Serial' undeclared (first use in this function); did you mean 'ceil'?
   Serial.println();
   ^~~~~~
   ceil
In file included from src/CoSIO.c:6:0:
.pio/libdeps/megaatmega2560/SD/src/SD.h: At top level:
.pio/libdeps/megaatmega2560/SD/src/SD.h:26:1: error: unknown type name 'namespace'
 namespace SDLib {
 ^~~~~~~~~
.pio/libdeps/megaatmega2560/SD/src/SD.h:26:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 namespace SDLib {
                 ^
.pio/libdeps/megaatmega2560/SD/src/SD.h:130:1: error: unknown type name 'using'; did you mean 'sinf'?
 using namespace SDLib;
 ^~~~~
 sinf
.pio/libdeps/megaatmega2560/SD/src/SD.h:130:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'SDLib'
 using namespace SDLib;
                 ^~~~~
.pio/libdeps/megaatmega2560/SD/src/SD.h:134:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
 typedef SDLib::File    SDFile;
              ^
.pio/libdeps/megaatmega2560/SD/src/SD.h:135:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
 typedef SDLib::SDClass SDFileSystemClass;
              ^
In file included from src/CoSIO.c:7:0:
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/libraries/SPI/src/SPI.h:72:1: error: unknown type name 'class'; did you mean 'labs'?
 class SPISettings {
 ^~~~~
 labs
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/libraries/SPI/src/SPI.h:72:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 class SPISettings {
                   ^
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/libraries/SPI/src/SPI.h:156:1: error: unknown type name 'class'; did you mean 'labs'?
 class SPIClass {
 ^~~~~
 labs
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/libraries/SPI/src/SPI.h:156:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 class SPIClass {
                ^
/Users/jestinsivarajah/.platformio/packages/framework-arduino-avr/libraries/SPI/src/SPI.h:322:8: error: unknown type name 'SPIClass'
 extern SPIClass SPI;
        ^~~~~~~~
src/CoSIO.c: In function 'CoSIO_parseLine':
src/CoSIO.c:152:11: warning: unused variable 'curChar' [-Wunused-variable]
     char* curChar = line;
           ^~~~~~~
src/CoSIO.c: In function 'CoSIO_readFileLine':
src/CoSIO.c:240:11: error: 'SD' undeclared (first use in this function); did you mean 'SDA'?
     ptr = SD.open(filename);
           ^~
           SDA
*** [.pio/build/megaatmega2560/src/CoSIO.c.o] Error 1

Non ce n'est pas réellement ca mon soucis, c'est juste j'avais au moins une cinquantaine de lignes d'erreur et je voulais juste savoir au début si c'est du fait que j'utilise la librairie SD.h pour un projet en C

Mais à present je vous ai mis la majorité de mes erreurs lorsque je compiles et tous cela venant de cette meme librairie

Il y a plusieurs erreurs, SD ne semble pas déclarer.
Donne ton code aussi, pour que l'on puisse voir ce qu'il a de si spécial.

J'ai du mal a voir ce que tu appel un projet C, tu as dit que tu étais dans l'IDE Arduino, a ma connaissance il utilise un compilateur C++, pas C.

void CoSIO_readFileLine(const char * filename, int line, char * output)
{
    FILE* ptr;
    char ch;
    int nb_add = 0;

    ptr = SD.open(filename);
 
    if (NULL == ptr) {
        printf("file can't be opened \n");
        return ;
    }
 
    int currentLine = 0;
    while (!feof(ptr)) {
        ch = fgetc(ptr);
        if (currentLine == line)
        {
            output[nb_add] = ch;
            nb_add ++;
        }
        if (ch == '\n')
        {
            if (currentLine == line)
            {
                break;
            }
            currentLine++;
        }
    }
    fclose(ptr);
    output[nb_add] = '\0';
}

Non je vous assure que sous l'IDE Arduino, nous pouvons code en C/C++

Du coup comment tu configure ton IDE pour qu'il n'accepte pas le C++?
Je ne connais pas trop cette façon de faire, mais pourquoi tu as le Framework Arduino dans platformIO, si tu utilise l'IDE Arduino ?

Tu n'aurais pas les commandes de compilation, parce que là ça ne ressemble pas du tout à ce que fait l'IDE Arduino.

Je pense qu'il nous manque des informations sur ta façon de faire.

Je pense qu'il utilise VisualStudio + PlateformeIO avec le framework Arduino

Oui c'est bien ca. J'utilise PlatformIO avec la framework Arduino