tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
Like Tree1Danke
ERLEDIGT
NEIN
ANTWORTEN
21
ZUGRIFFE
503
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Du solltest versuchen den Code zu verstehen.

    Zitat Zitat von MSVCplusplus Beitrag anzeigen
    PS Auch wenn ich speicher.close() wegglasse kommt die gleiche debugger meldung
    Das ist klar, da close() spätestens im Destruktor automatisch aufgerufen wird.

    Dann sollte man vermeiden zuviel zu casten, da hätte einem der Compiler den Code schon um die Ohren geworfen:
    Code cpp:
    1
    
    fwrite(&anz, sizeof(anz), 1, dat);

    Außerdem ist fast keine Fehlerprüfung in dem Code drin. Das solltest du noch anpassen.

    Weiterhin frage ich mich: wieso so kompiliziert? In C++ geht das doch einfacher.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  2. #17
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    jetzt auch getestet und korrigiert.

    Wenn du das close beim Speichern "weglässt" wird es trotzdem im Destruktor gemacht.
    Hätte also nicht wirklich was gebracht.
    Außerdem icst es wichtig. Nicht nur zum ordentlichen Schließen, sondern weil da noch die Namen/Offsets/Längen der Dateien reingeschrieben werden müssen.
    Ohne dem kann multifile_load nichts damit anfangen.

    Und weil der Einfachkeit zuliebe nicht kontrolliert wird, ob die angegebene Datei wirklich von multifile_save erstellt wurde, werden witzige Probleme auftreten.

    Also nicht zm Ausprobieren irgendeine Datei zum loaden angeben, die eigentlich was ganz anderes ist. Mit etwas Pech machts dann GB-weise Mülldaten.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    
    #include <stdio.h>
    #include <io.h>
    #include <string.h>
    #include <malloc.h>
    #include <windows.h>
     
    struct multifile_fentry
    {
        char name[256];
        UINT32 len, off;
    };
     
    class multifile_save
    {
    protected:
     
        struct multifile_fentry *dic;
        UINT32 anz;
        FILE *dat;
     
        multifile_save(multifile_save &x) {}
        multifile_save &operator=(multifile_save &x) { return *this; }
     
    public:
        multifile_save()
        {
            dat = NULL;
            dic = NULL;
            anz = 0;
        }
        ~multifile_save()
        {
            close();
        }
     
        int open(const char *destfile)
        {
            dic = (struct multifile_fentry *)malloc(sizeof(multifile_fentry) * 0);
            anz = 0;
            if(dic == NULL)
                return 1;
            dat = fopen(destfile, "wb");
            if(dat == NULL)
            {
                free(dic);
                return 2;
            }
            return 0;
        }
     
        void close()
        {
            if(dat != NULL)
            {
                fwrite((void *)dic, sizeof(multifile_fentry), anz, dat);
                fwrite((void *)(&anz), 4, 1, dat);
                fclose(dat);
                free(dic);
                dic = NULL;
                dat = NULL;
                anz = 0;
            }
        }
     
        int addfromfile(const char *filename, const char *archivename)
        {
            FILE *readfile;
            UINT32 len;
            char buf[1024];
            if(strlen(archivename) > 255)
                return 1;
            readfile = fopen(filename, "rb");
            if(readfile == NULL)
                return 2;
            if((anz % 20) == 0)
            {
                struct multifile_fentry *dic2;
                UINT32 j;
                dic2 = (struct multifile_fentry *)malloc(sizeof(multifile_fentry) * (anz + 20));
                if(dic2 == NULL)
                {
                    fclose(readfile);
                    return 3;
                }
                for(j = 0; j < anz; j++)
                {
                    dic2[j].len = dic[j].len;
                    dic2[j].off = dic[j].off;
                    strcpy(dic2[j].name, dic[j].name);
                }
                free(dic);
                dic = dic2;
            }
            dic[anz].off = ftell(dat);
            len = filelength(fileno(readfile));
            dic[anz].len = len;
            strcpy(dic[anz].name, archivename);
            anz++;
            while(len > 1024)
            {
                fread(buf, 1, 1024, readfile);
                fwrite(buf, 1, 1024, dat);
                len -= 1024;
            }
            fread(buf, 1, len, readfile);
            fwrite(buf, 1, len, dat);
            fclose(readfile);
            return 0;
        }
     
        int addbytes(const char *bytes, UINT32 bytelen, const char *archivename)
        {
            if(strlen(archivename) > 255)
                return 1;
            if((anz % 20) == 0)
            {
                struct multifile_fentry *dic2;
                UINT32 j;
                dic2 = (struct multifile_fentry *)malloc(sizeof(multifile_fentry) * (anz + 20));
                if(dic2 == NULL)
                    return 3;
                for(j = 0; j < anz; j++)
                {
                    dic2[j].len = dic[j].len;
                    dic2[j].off = dic[j].off;
                    strcpy(dic2[j].name, dic[j].name);
                }
                free(dic);
                dic = dic2;
            }
            dic[anz].off = ftell(dat);
            dic[anz].len = bytelen;
            strcpy(dic[anz].name, archivename);
            anz++;
            fwrite(bytes, 1, bytelen, dat);
            return 0;
        }
    };
     
    class multifile_load
    {
    protected:
     
        struct multifile_fentry *dic;
        UINT32 anz;
        FILE *dat;
     
        multifile_load(multifile_load &x) {}
        multifile_load &operator=(multifile_load &x) { return *this; }
     
    public:
        multifile_load()
        {
            dat = NULL;
            dic = NULL;
            anz = 0;
        }
        ~multifile_load()
        {
            close();
        }
     
        int open(const char *sourcefile)
        {
            dat = fopen(sourcefile, "rb");
            if(dat == NULL)
                return 1;
            fseek(dat, -4, SEEK_END);
            fread((void *)(&anz), 4, 1, dat);
            dic = (struct multifile_fentry *)malloc(sizeof(multifile_fentry) * anz);
            if(dic == NULL)
            {
                fclose(dat);
                return 2;
            }
            fseek(dat, -4 - (sizeof(multifile_fentry) * anz), SEEK_END);
            fread((void *)dic, sizeof(multifile_fentry), anz, dat);
            return 0;
        }
     
        void close()
        {
            if(dat != NULL)
            {
                fclose(dat);
                free(dic);
                dic = NULL;
                dat = NULL;
                anz = 0;
            }
        }
     
        UINT32 getlength(const char *archivename)
        {
            UINT32 i;
            for(i = 0; i < anz; i++)
            {
                if(!strcmp(dic[i].name, archivename))
                    break;
            }
            if(i >= anz)
                return -1;
            return dic[i].len;
        }
     
        int readtofile(const char *filename, const char *archivename)
        {
            FILE *writefile;
            UINT32 len, i;
            char buf[1024];
            for(i = 0; i < anz; i++)
            {
                if(!strcmp(dic[i].name, archivename))
                    break;
            }
            if(i >= anz)
                return 1;
            writefile = fopen(filename, "wb");
            if(writefile == NULL)
                return 2;
            fseek(dat, dic[i].off, SEEK_SET);
            len = dic[i].len;
            while(len > 1024)
            {
                fread(buf, 1, 1024, dat);
                fwrite(buf, 1, 1024, writefile);
                len -= 1024;
            }
            fread(buf, 1, len, dat);
            fwrite(buf, 1, len, writefile);
            fclose(writefile);
            return 0;
        }
     
        int readbytes(char *bytes, UINT32 maxbytelen, const char *archivename)
        {
            UINT32 i;
            for(i = 0; i < anz; i++)
            {
                if(!strcmp(dic[i].name, archivename))
                    break;
            }
            if(i >= anz)
                return 1;
            if(dic[i].len < maxbytelen)
                maxbytelen = dic[i].len;
            fread(bytes, 1, maxbytelen, dat);
            return 0;
        }
    };
     
    int main()
    {
        return 0;
    }

    Gruß
     

  3. #18
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Danke @deepthroat leider konnte ich den Code noch nicht durchlesen weil ich kein pc hatte konte nur ganz kurz testen.
    Und an den Destruktur ahbe ich nicht gedacht
    @sheel Danke ich werds jetzt testen....

    EDIT: SO getestet funktioniert alles lesen schreiben und noch ein Frage an deepthroat bei dem aktuellen qullcode müssen da noch fehlerbehebungen rein?

    Danke MFG
    Geändert von MSVCplusplus (17.08.11 um 13:32 Uhr)
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  4. #19
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Um sicher zu gehen wärs nicht schlecht.
    Die am häufigsten auftretenden Fehler (wie zB. eine nicht existierende Datei bei fopen) werden zwar geprüft, aber...wenn man es wirklich genau machen will, kann man so ziemlich jeden Funktionsaufruf auf irgendwelche Fehler abfragen.

    edit: Auf die Schnelle durchgeschaut könnten folgende Funktionen noch Abfragen vertragen:
    fwrite
    fread
    ftell
    fseek
    filenegth
    fileno
    fclose

    Also so ca. alle Dateifunktionen außer Öffnen
    Geändert von sheel (17.08.11 um 13:51 Uhr)
     

  5. #20
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    OK Dann werde ich mal weiterschreiben
    MFG
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  6. #21
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    So ich habe nun alles Fertig
    Jetzt habe ich eine Frage: Was ist wenn auf dem Zielverzeichnis kein Speicher ist? Was passiert dann?
    Danke
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  7. #22
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von MSVCplusplus Beitrag anzeigen
    So ich habe nun alles Fertig
    Jetzt habe ich eine Frage: Was ist wenn auf dem Zielverzeichnis kein Speicher ist? Was passiert dann?
    Naja, was denkst du denn was passiert?

    Die Schreibfunktionen signalisieren einen Fehler. Der Stream wird in einen Fehlerzustand versetzt (ferror Funktion gibt true zurück).

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. datein in exe packen
    Von MSVCplusplus im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 15.02.11, 09:56
  2. Smilies in eine Kiste packen
    Von thehasso im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 09.10.09, 11:28
  3. Gästebuch.php in eine Div packen
    Von ray2mi im Forum PHP
    Antworten: 14
    Letzter Beitrag: 04.09.09, 12:38
  4. 2 Datein in eine Datei packen
    Von MirakFH im Forum PHP
    Antworten: 4
    Letzter Beitrag: 28.08.05, 16:53
  5. Antworten: 4
    Letzter Beitrag: 08.06.02, 22:16

Stichworte