Dateigröße



  • @DerAltebburger:

    Die Frage habe ich ihm eben auch schon beantwortet mit dem folgendem Code:

    void main()
    {
    float zaehler = 0;
    int shit;
    
    FILE * Dateizeiger;
    Dateizeiger=fopen("C:\\dateiname.bla","rb"); // Binär öffnen das ganze
    while(!feof(Dateizeiger)) // solange EndOfFile nicht erreicht ist 
    {
        fscanf(Dateizeiger,"%c", &shit); // ein zeichen einlesen 
        zaehler++; // und den zaehler um 1 erhöhen
    }
    fclose(Dateizeiger);
    printf("Dateigroesse in Bytes: %.2f", zaehler-1); // -1 weil das EnfOfFile noch drin ist.
    getch();
    }
    

    Das Problem bei dieser Methode ist dass sie sehr langsam werden kann wenn die File ein bissel grösser ist.

    [ Dieser Beitrag wurde am 29.03.2003 um 21:20 Uhr von Peter Piksa editiert. ]



  • *Das Problem bei dieser Methode ist dass sie sehr langsam werden kann wenn die File ein bissel grösser ist.

    Geau deshalb mit fseek(...) den filepointer an's ende setzen und testen wo der steht! geht ruckzuck! 😉



  • i = fseek(fp, 128, SEEK_END);

    Setz ich den FileCursor so 128 Byte vor oder nach das Dateiende?



  • warum postet ihr solche C Sachen ins C++ Forum?



  • @DerAltenburger:
    Ok, Fabian und ich hams nun hinbekommen.
    Allerdings haben wir uns mit deiner Lösung sehr schwer getan, das wollte einfach nicht laufen. Kannst du mir mal ein funktioierendes Beispielprogramm geben? (nur so dass man weiss wie mans sonst noch machen könnte)

    Hier das ist der Code mit dem ich die grösse in Byte ermittle:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    void main()
    {
    
        struct _stat buf;
        int result;
    
        result = _stat( "C:\\Eminem Dr. Dre Black Rob And More-Summer 2000 Rap Mix.mp3", &buf );
    
        if( result != 0 )
        perror( "Problem getting information" );
        else
        printf( "File size     : %ld\n", buf.st_size );      
    }
    


  • [ Dieser Beitrag wurde am 30.03.2003 um 01:10 Uhr von Fabian Bernecker editiert. ]



  • Hallo,
    es gibt keine wirklich portable Möglichkeit zur Bestimmung der Größe einer Datei. Weder in C noch in C++.

    Ein C++-Variante die auf "normalen" System funktioniert:

    #include <fstream>
    using namespace std;
    int main()
    {
        ifstream inFile("bakaablssl.mp3", ios::binary);
        inFile.seekg(0, ios::end); 
        unsigned long fileSize = std::streamoff(inFile.tellg());
        inFile.seekg(0, ios::beg); 
    }
    

    In C verwendet man halt fseek und ftell.

    #include <stdio.h>
    
    int main()
    {
        FILE* pFile = fopen("test.exe", "rb");
        if (pFile)
        {
            fseek(pFile, 0, SEEK_END);
            long fileSize = ftell(pFile);
            fseek(pFile, 0, SEEK_SET);
        }
    }
    


  • @Fabian

    *i = fseek(fp, 128, SEEK_END);
    Setz ich den FileCursor so 128 Byte vor oder nach das Dateiende?
    *

    Damit setzt Du den Pointer HINTER das Dateiende!!!
    -> Es entsteht eine Lücke mit undefiniertem Inhalt!!! (oder je nach Compiler ein Fehler?)

    Setze NIE den Pointer vor den Anfang
    Vermeide den Pointer hinter das Ende zu setzen!

    das Speibiel hat HumeSikkins schon geliefert!

    @HumeSikkins
    Am Ende sollte fclose(pFile) nicht fehlen!!!



  • Original erstellt von DerAltenburger:
    **
    Am Ende sollte fclose(pFile) nicht fehlen!!!**

    RAII geschädigt 😃 😃
    (geschädigt?)



  • @Fisch

    RAII ??? 😕



  • Ich denke er meint Red Alert 2 (C&C 4)



  • blubb 🙄 😃

    was ich meine ist Resource Acquisition Is Initialisation oder k.a. wie man das ausschreibt 😃
    mit fstreams muss hume die streams nicht schließen, weil das im destruktor passiert. das hat vorteile, denn wen eine ausnahme geworfen wird, wird automatisch der destruktor aufgerufen, fclose müsste man da dann aber manuell aufrufen.
    damit wäre die gesamte exception safety im Ar***.
    nach dem RAII-Prinzip wird im konstruktor alles angegeben (fstream file("bla") und nicht
    fstream file; file.open("bla")) , und im destruktor automatisch vernichte´t



  • Ach sooooo

    Mir gings um den C- Teil mit fopen()...., da sollte man das auch fclos()en.

    Bei fstreams isses klar!



  • und ich hab gemeint, dass er nach (normalerweise) so viel RAII vergessen hat, das die C-Funktionen das nicht beherrschen und manuell mit fclose beendet werden muss 😃



  • @DerAltenburger
    Soll das lustig sein? Habe ich irgendwo geschrieben, dass dies vollständige Programme sind? Siehst du irgendwo eine Fehlerprüfung? Im C++-Programm? Meinst du jemand besitzt eine Datei "bakaablssl.mp3"?

    Meinst du es macht Sinn die Dateigröße zu bestimmen und dann fertig. Nicht mal eine Ausgabe?
    Dir scheint es nicht aufgefallen zu sein, deshalb schreibe ich es nochmal explizt: Das sind Codeschnipsel! Sie sollen demonstrieren, wie man *prinzipiell* die Dateigröße einer Datei bestimmt. Sie demonstrieren *nicht* wie man ordentliche Programme schreibt.
    Ich habe nicht mal garantiert, dass sie funktionieren. Ich habe sie nicht mal compiliert. Zugegeben, durch die Einbettung in main und durch das inkludieren der Header habe ich wohl einen falschen Eindruck erweckt. Auf der anderen Seite
    muss ich aber auch nicht immer alles explizit hinschreiben.

    Weiß von mir aus darauf hin, dass am Ende der Dateibearbeitung ein fclose stehen sollte. Aber stell mich hier bitte nicht als Idiot dar, der zu blöd ist ne manpage zu lesen.

    Aber trotzdem vielen Dank. Ist immer wieder schön zu sehen, dass ihr euch soviele Sorgen um meine Fähigkeiten macht.

    [ Dieser Beitrag wurde am 30.03.2003 um 18:48 Uhr von HumeSikkins editiert. ]



  • schön rausgeredet hume 😃 😃 😡



  • Meine Fresse, macht es doch einfach alle besser.
    Dann brauche ich mich hier micht weiter rumärgern.



  • Das ist aber jemand schlecht gelaunt. Zu viel Stress, was?



  • Das ist aber jemand schlecht gelaunt. Zu viel Stress, was?

    Wie schön, dass du an meiner Laune interessiert bist. Um nicht noch als unhöflich abgestempelt zu werden, möchte ich auf deine Frage mal antworten. Auch wenn's OT ist.

    Meine Laune ist ausgezeichnet (sie war es zumindest bis eben und wird es in 10 Minuten wieder sein). Das Wetter ist herrlich, wir haben unseren Gegner beim FuBa heute 13:5 weggeputzt, ich habe vorhin das erste Eis des Jahres gegessen, dass dazu noch sehr lecker war. Alles in allem ein schöner Tag.

    Das alles ändert aber nichts an meiner Sensibilität und daran, dass ich das Klima hier als sehr feindselig und nörgelig empfinde.
    Und ich warte nach wie vor darauf, dass aus den Reihen der ständigen Meckerer endlich einer vortritt und zeigt, dass er es besser kann.



  • Original erstellt von HumeSikkins:
    Meine Fresse, macht es doch einfach alle besser.
    Dann brauche ich mich hier micht weiter rumärgern.

    mach dir nix draus, du bist einfach total gut in C++, da wird einem halt jeder winzigste fehler peinlichst genau nachgesagt 🙂 aber das denke ich darfst du nur als kleinen scherz verstehen. nur über das internet kann man schlecht gesichtsausdrücke weitergeben, das forum hat noch keine videokonferenzfunktion 😉
    nimm's am besten gar nicht wahr 🙂


Anmelden zum Antworten