-
16.08.11 16:46 #1
Hallo
Ich möchte gerne zB Bilder mit C++ in nur eine Datei packen aber nicht komprimieren!
nun will ich mit C++ direkt die Datei zB Bild_22.png öfnnen ohne die vorher erstellte Datei wieder zu entpacken!
Also qusie so:
öffne_Datei("Gepackte_Datei.datei\\Bild_22.png");
ist so was möglich?
DankeFehlermeldung bitte!
Google - Dein Freund und Helfer
-
Hi
wenn du die Bilder in deinem Programm anzeigst, möglich.
Wenn sie mit dem Standardprogramm oder sonst irgendwas geöffnet werden sollen: Zuerst entpacken.
Theoretisch wäre es zwar ohne auch möglich, aber da müsste das andere Programm mitmachen. Und ich kenn kein Bildprogramm, das sich von einer angegebenen Adresse aus dem Speicherbereich eines Fremdprogramms ein Bytearray zum Öffnen holt.
-
16.08.11 16:52 #3
Es soll kein fremdes programm entpacken nur mein programm soll die dateien alle in eine reinschreiben und sie auch wieder lesen können.
Und das alles bitte möglichst schnell sinst bracuht es so lange zum Laden.
MFG
DankeFehlermeldung bitte!
Google - Dein Freund und Helfer
-
Und wo ist dann das Problem?
Zuerst Datei öffnen, Verzeichnis rein, Daten rein, schließen.
Datei öffnen, Verzeichnis durchsuchen, seek zur gewünschten Position, bestimtme Byteanzahl lesen, schließen.
-
16.08.11 17:25 #5
hä? ok das kapier ich nicht wie kann ich zb 3 Blder in eine Datei packen und wieder auslesen?
Das versteh ich nicht wirklich
MFGFehlermeldung bitte!
Google - Dein Freund und Helfer
-
Muss die Datei zB. ein gültiges Zip sein, das mit anderen Programmen öffenbar ist, oder nur für deins?
Wenn nur für deins:
Öffne die Datei im Binärmodus (bei fopen rb und wb statt r und w)
Dann schreibst du zB. Die Anzahl der Bilder drinnen als int(4 Byte, nicht ascii) rein.
Dann kommt pro Bild ein int mit der Postion, wo die Daten in der Datei anfangen, ein int mit der Byteanzahl und der Dateiname.
Dann die Daten.
Zum Auslesen gehst du die Dateinamen/Länge/Offset durch, um herauszufinden, welche Bilder drin sind und welches du auslesen willst.
Von diesem springst du dann mit fseek (oder vergleichbares bei iostream) zum Offset und liest Anzahl Bytes aus.
Gruß
-
16.08.11 17:52 #7
Ok du sry aber das ist glaub ich noch etwas zu komplizeirt für mich

Könntest du da irgendwie ein link finden oder ein Codeschnipsel tut es auch, nur zum lesen und schreiben.
Und ja die Datei soll nur für mein prog sein.
PS Wie krig ich auf den byte ganu die größe eines Bildes/Datei/Sounds?Fehlermeldung bitte!
Google - Dein Freund und Helfer
-
Windows oder Linux?
Nur reines klassenloses C oder auch C++ erlaubt?
Und bevor ich einen Link zu einem Code genau für dieses Problem finde, kann ich es vermutlich selber schneller programmieren. Ist wirklich nicht viel.
fopen, fclose, fileno, _filelength, fread, fwrite, malloc, free.
Mehr braucht man nicht.
-
16.08.11 18:00 #9
Danke für deine geduld

Also Windows und C++Fehlermeldung bitte!
Google - Dein Freund und Helfer
-
Wenn du es nicht zu eilig hast, schreib ich irgendwann heute noch was kleines zusammen.
-
16.08.11 18:21 #11
Ok danke aebr wenns geht und nur wenn du willst vor 20:50 weil ich (glaub ich) erst mal für ein Tag kein Computer habe Gruß
Fehlermeldung bitte!
Google - Dein Freund und Helfer
-
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
#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() { 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() { 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ß
-
16.08.11 20:57 #13
Danke!
Aber ne kurze erklärung? Ist da noch was zu machen? Also 2 Bilder rein und dann das zweite anzeigen/öffne was auch immer?
Dann hast dus geschafft
MFGFehlermeldung bitte!
Google - Dein Freund und Helfer
-
Also
Beispiel zum Abspeichern der zwei Bilder a.jpg und b.bmp in einer Datei beide.xyz
Der zweite Parameter beim addfromfile kann irgendein beliebiger Name sein, muss nicht der Dateiname sein.Code cpp:1 2 3 4 5
multifile_save speicherer; speicherer.open("beide.xyz"); speicherer.addfromfile("a.jpg", "a.jpg"); speicherer.addfromfile("b.bmp", "b.bmp"); speicherer.close();
Damit du das Bild wieder rausbekomsmt brauchst du dann diesen Namen vom zweiten Parameter.
Rückgabewerte soltlen noch geprüft werden: 0 ist immer OK, was anderes ist ein Fehler.
Nur close hat keinen Returnwert.
Was man beim Abspeichern sonst noch machen kann: Als Quelle statt einer Datei ein Bytearray nehmen, mit addbytes.
Herauslesen von a.jpg in eine Datei
Der zweite Parameter beim readtofile ist wieder der frei wählbare Name.Code cpp:1 2 3 4
multifile_load leser; leser.open("Beide.xyz"); leser.readtofile("a.jpg", "a.jpg"); leser.close();
Erster Parameter ist der neue echte Dateiname.
Rückgabewerte sollten auch hier geprüft werden.
Außerdem kann man wieder optional die Daten in ein Bytearray holen, mit readbytes.
Wieviel Byte eines der gespeicherten Bilder hat, erfährt man mit getlength.
Achtung: Es lässt sich zwar kompilieren, ich habs aber nicht wirklich gründlich getestet.
Falls was nicht funktioniert melde dich nocheinmal
GrußGeändert von sheel (16.08.11 um 22:20 Uhr) Grund: Typo
-
17.08.11 06:59 #15
So habs jetzt getestet dann kam Test.exe Funktioniert nicht mehr.
Dann habe ich es im debug ausgeführt und in void close bei multifile_save kommt zugriffsverletzung in der zeile:
vollständiger code:Code cpp:1
fwrite((void *)anz, 4, 1, dat);
DankeCode 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
#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() { 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() { 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() { multifile_save speicherer; speicherer.open("beide.xyz"); speicherer.addfromfile("a.jpg", "a"); speicherer.addfromfile("b.png", "b"); speicherer.close(); return 0; }
PS Auch wenn ich speicher.close() wegglasse kommt die gleiche debugger meldungGeändert von MSVCplusplus (17.08.11 um 07:02 Uhr)
Fehlermeldung bitte!
Google - Dein Freund und Helfer
Ähnliche Themen
-
datein in exe packen
Von MSVCplusplus im Forum C/C++Antworten: 5Letzter Beitrag: 15.02.11, 09:56 -
Smilies in eine Kiste packen
Von thehasso im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 09.10.09, 11:28 -
Gästebuch.php in eine Div packen
Von ray2mi im Forum PHPAntworten: 14Letzter Beitrag: 04.09.09, 12:38 -
2 Datein in eine Datei packen
Von MirakFH im Forum PHPAntworten: 4Letzter Beitrag: 28.08.05, 16:53 -
Den Ausdruck in eine Varie packen !
Von CvH im Forum PHPAntworten: 4Letzter Beitrag: 08.06.02, 22:16



1Danke

Zitieren

Login






