Datei lesen



  • Hi!

    Ich hab ein Problem und zwar möchte ich einfach nur eine Datei auslesen! Habe aber noch Probleme damit die Dateigröße zu bestimmen!

    FILE *pFile = fopen("/proc/net/dev", "rb");
      long FileSize=0;
      fseek(pFile, 0 , SEEK_END);
      FileSize = ftell(pFile);
      fseek(pFile, 0 , SEEK_SET);
      char Buffer[FileSize];
      fgets(Buffer, FileSize, pFile);
      printf("Genau : %ld Bytes \n ", FileSize);
      fclose(pFile);
    

    Das Fazinierende ist, dass die Ausgabe bei "einfachen" Dateien ohne Probleme funktioniert, aber bei der /proc/net/dev Datei ist das ergebnis immer 0.
    Ebenfalls habe ich bereits überprüft ob pFile NULL ist nach dem Öffnen und nein auch das ist nicht der Fall, ich hab aber keine Ahnung was ich noch ausprobieren soll.

    bis dann morti



  • Hallo,

    ich denke das liegt daran, dass du den Inhalt des proc Verzeichnisses nicht wie herkömmliche Datein behandeln kannst.

    // Das zeigt auch an, dass die Datei leer wäre...
    file /proc/net/dev  
    
    // ..das aber nicht
    cat /proc/net/dev
    


  • In /proc geht kein fseek. Das "b" bei "rb" kannst du dir soundso sparen. Wozu soll das gut sein?



  • (nebenbei wenn Unix/Linux getrennte binary/text Modi hätten, wäre fseek auch schon wegen dem binär Modus nicht erlaubt AFAIK. So ist es eben wegen /proc nicht erlaubt, da /proc ja ein simuliertes FS ist und die "Dateien" keine größe besitzen)



  • Grundsätzlich gibt es Devices vom Typ "block special file" (sind bei "ls -l" durch ein "b" am Anfang gekennzeichnet) und vom Typ "character special file" (Kennzeichnung durch ein "c" bei "ls -l"). Letztere können nur sequenziell ausgelesen werden - ein fseek() funkioniert nicht (Beispiel: Soundkarte /dev/dsp). Bei "block special files" (Beispiel: Festplatte /dev/hda1) sollte fseek() funktionieren.

    Mehr zu Devices findest du hier 😃

    Martin



  • Ah dankeschön für die ganzen Antworten! Wie erstelle ich dann einen vernünftig dimensionierten Buffer der genauso groß ist wie die Datei ist? Mit zwei lesedurchläufen?

    bis dann morti


Anmelden zum Antworten