Dateigröße



  • Hallo zusammen 🙂

    Ich habe 2 Fragen an euch.

    1. Wie kann man die Größe einer Datei ermitteln? (in Byte)
    2. Ich lese die 1. Zeile einer Datei aus und bearbeite sie. Wie kann ich sie jetzt wieder auch in der 1. Zeile speichern?

    Würde mich freuen wenn mir jemand helfen könnte 🙂

    MfG Fabian



  • Du solltest den Leuten auch noch mitteilen dass es sich um den Umgang mit Mp3s handelt. Er arbeitet nämlich zusammen mit mir auch an dem selben Tool (ich hatte ja schon einen langen beitrag über den Mp3Header).

    Fabians aufgabe ist es den MP3-ID3 Tag auszulesen/editeren.



  • @Peter Piksa

    Du muesstest die Frage doch beantworten koennen!

    @Fabian

    1. Probier mal FindFirst (FindFirstFile o.ä.): Da wird im record Size geliefert!
    oder : mit fseek(....) FilePointer der Datei ans Ende setzen und mit fgetpos(...) Position ermitteln! Schau mal in Hilfe ziu den Befehlen.

    2. Wenn Länge der Zeile gleich bleibt:
    mit fseek(...) Filepointer auf 0 vom Anfang setzen, schreiben, fertig
    Sonst:
    die 1. Zeile in neue Datei schreiben
    den Rest (Blockweise /zeilenweise aus Original lesen + in neue Datei schreiben, bis Inhalt komplett ist.
    Am Ende Testen ob allse da ist und Original löschen.
    Ev. neue Datei zurueckbenennen.



  • Ich probiers gleich mal aus 🙂 danke

    und die Zeile nicht immer die gleiche Länge.

    und @ peter, hier die rache 😉 dat sind wir beim proggn *g

    http://www.thedevilsclan.de/1.jpg
    http://www.thedevilsclan.de/2.jpg



  • @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 😃 😃 😡


Anmelden zum Antworten