Datei kopieren...
-
Hi!
Ich wollte mir ein tool schreiben, das mir viele dateien in eine datei schreibt, jedoch klappt das irgendwie nicht so ...
ich gebe ihm eine 53kb file, und raus kommt ein 1byte filehier mal der source
////////////////////////////////////////////////////////////////////////////////////////////////// // Name: EncodeAndWrite() // Desc: Encodes and Writes the File. ////////////////////////////////////////////////////////////////////////////////////////////////// void WriteToJPF(JPFItem *pItems, int iNumItems) { printf("%d\n", __LINE__); FILE *pF = fopen("jpffile.jpf", "w+b"); for(int i = 0; i < iNumItems; i++) { printf("Writing -> %s...", pItems[i].chFilename); fwrite(&pItems[i], sizeof(pItems[i]), 1, pF); printf("done!\n"); } printf("%d\n", __LINE__); printf("Finished!\n"); fseek(pF, 0, SEEK_END); int iFileSize = ftell(pF); printf("JPF-File size -> %d\n", iFileSize); fclose(pF); } ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// // Name: main() // Desc: . ////////////////////////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if(argc == 1) { printf("JPFCreator -> Usage: jpfcreator.exe filename1 filename2 filename[n]\n"); printf("JPGCreator -> Outputfile is allways jpffile.jpf, you can rename it later on.\n"); return 0; } printf("%d\n", __LINE__); JPFItem *Items = new JPFItem[argc-1]; for(int i = 1; i < argc; i++) { printf("Reading -> %s\n", argv[i]); Items[i-1].chFilename = new char[strlen(argv[i])]; strcpy(Items[i-1].chFilename, argv[i]); Items[i-1].iFileNameLength = strlen(argv[i]); FILE *pF = fopen(Items[i-1].chFilename, "rb"); printf("%d\n", __LINE__); fseek(pF, 0, SEEK_END); Items[i-1].iFileSize = ftell(pF); rewind(pF); printf("%d\n", __LINE__); Items[i-1].pData = new unsigned char[Items[i-1].iFileSize]; fread(Items[i-1].pData, Items[i-1].iFileSize, 1, pF); printf("%d\n", __LINE__); fclose(pF); } WriteToJPF(Items, argc-1); return 0; } ////////////////////////////////////////////////////////////////////////////////////////////////// //achso, die struct typedef struct t_jpfitem { int iFileNameLength; char *chFilename; int iFileSize; unsigned char *pData; }JPFItem;
weiss wer warum das nicht so funktioniertt wie ich mir das denke?
greets,
cNc
-
Also ich habs jetzt immerhin schon soweit geschaft das das file 4kb groß ist, fehlen noch 49kb zur größe des original-files ...
-
cNcMasta schrieb:
fwrite(&pItems[i], sizeof(pItems[i]), 1, pF); typedef struct t_jpfitem { int iFileNameLength; char *chFilename; int iFileSize; unsigned char *pData; }JPFItem;
du schreibst ja auch nur die größe der struktur in die datei
mach es doch so:printf("Writing -> %s...", pItems[i].chFilename);
fwrite(&pItems[i].iFileNameLength, sizeof(pItems[i].iFileNameLength), 1, pF);
fwrite(&pItems[i].chFilename, pItems[i].iFileNameLength, 1, pF);
fwrite(&pItems[i].iFileSize, sizeof(pItems[i].iFileSize), 1, pF);
fwrite(&pItems[i].pData, pItems[i].iFileSize, 1, pF);
printf("done!\n");@mods
tags gingen nicht *schniff*
-
Wenn Du einen Zeiger in eine Datei schreibst, sind das nur 4 Bytes.
Es werden dann ja nicht die Daten selbst geschrieben, sondern nur die Adresse, also der Wert des Zeigers. Das bringt natürlich garnichts, und wenn Du es später wieder laden willst, hat der Zeiger ja überhaupt keine Bedeutung mehr.
-
Jo, aber ich bekomm es einfach nicht hin die daten statt des zeigers zu schreiben, wie mach ich das?
greets,
cNc
p.s: danke schonmal!
-
siehe oben !!!!
-
Hi!
Hab jetzt alles auf C++-Streams portiert, und jetzt klappt es, (auch hier musste ich nochn bisel rumtüfteln...)danke für die hilfe!
-
vielleicht hast du ja auch unbewusst einen mega-kompressions-algorithmus entwickelt
man, das wär ja was: jpeg, was sowieso schon komprimiert ist, von 59 kb auf 4 kb. ***TRÄUM***
.......................
-
so sieht mein code im moment aus, nur leider werden beim auslesen die dateinamen verändert, sprich werden unleserliche zeichen drangehangen ....
void CreateNXP(void) { ofstream fout("package.nxp", ios::out | ios::binary); int iNumItems = AskUserInt("Wie viele Dateien wollen sie in die neue NXP schreiben?"); fout.write((char*)&iNumItems, sizeof(int)); NXPItem *pItems = new NXPItem[iNumItems]; for(int i = 0; i < iNumItems; i++) { string strFilename = AskUserStr("Dateiname " + i + '?'); pItems[i].iFileNameLength = strFilename.length(); pItems[i].chFilename = new char[strFilename.length()+1]; strcpy(pItems[i].chFilename, strFilename.c_str()); ifstream fin(strFilename.c_str(), ios::in | ios::binary); fin.seekg(0, ios::end); pItems[i].iFileSize = (int)fin.tellg(); fin.seekg(0, ios::beg); pItems[i].pData = new unsigned char[pItems[i].iFileSize+1]; fin.read((char*)pItems[i].pData, pItems[i].iFileSize); int iFS = pItems[i].iFileSize; int iFL = pItems[i].iFileNameLength; pItems[i].iFileNameLength = pItems[i].iFileNameLength ^ XOR_VAL; pItems[i].iFileSize = pItems[i].iFileSize ^ XOR_VAL; fout.write((char*)&pItems[i].iFileNameLength, sizeof(int)); fout.write(pItems[i].chFilename, iFL); fout.write((char*)&pItems[i].iFileSize, sizeof(int)); fout.write((char*)pItems[i].pData, iFS ); fin.close(); delete [] pItems[i].chFilename; delete [] pItems[i].pData; } fout.close(); delete [] pItems; } ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// // Name: ExtractFromNXP() // Desc: Extracts the files from the NXP. ////////////////////////////////////////////////////////////////////////////////////////////////// void ExtractFromNXP(void) { string strFN = AskUserStr("Bitte geben sie den Dateinamen der NXP ein, die sie extrahieren wollen!"); ifstream fin(strFN.c_str(), ios::in | ios::binary); int iNumItems; fin.read((char*)&iNumItems, sizeof(int)); NXPItem *pItems = new NXPItem[iNumItems]; for(int i = 0; i < iNumItems; i++) { fin.read((char*)&pItems[i].iFileNameLength, sizeof(int)); pItems[i].iFileNameLength = pItems[i].iFileNameLength ^ XOR_VAL; pItems[i].chFilename = new char[pItems[i].iFileNameLength]; fin.read(pItems[i].chFilename, pItems[i].iFileNameLength); fin.read((char*)&pItems[i].iFileSize, sizeof(int)); pItems[i].iFileSize = pItems[i].iFileSize ^ XOR_VAL; pItems[i].pData = new unsigned char[pItems[i].iFileSize]; fin.read((char*)pItems[i].pData, pItems[i].iFileSize); ofstream fout(pItems[i].chFilename, ios::out | ios::binary); fout.write((char*)pItems[i].pData, pItems[i].iFileSize); fout.close(); delete [] pItems[i].chFilename; delete [] pItems[i].pData; } delete [] pItems; }
weiss wer was da das problem ist?
-
Ja, 1337.
Damit wäre deine Frage beantwortet.