C spakowanie kilku plików do pliku binarneg


(arekk-99) #1

Da się to zrobić tak, że w jakiś sposób spakuję kilka plików do pliku binarnego i potem będę mógł się do nich odwołać? Np 2 pliki wav i po spakowaniu odtworzyć je sdl-m?


(Rolek0) #2

 

Tak, da się tak zrobić :wink:

 

Może to Cię zainspiruje:

(oczywiście to samo możesz zrobić używając standardowych funkcji C, lub jak wolisz z SDL)

 

Dodatkowo polecam:

 


(arekk-99) #3

Przeczytałem wirtualny system plików, stworzyłęm archiwum, ale nijak nie działa mi to odwoływanie się do niego.
Skorzystałem z md5 z linku, który był tam podany (implementacja dla C) sciągnąlem z sourceforge. Ale nie umiem zrobić tej calcmd5. Wyrzuca mi jakieś krzaczory i nie da się wyciągnąć pliku.
void calcMd5(const char* txt, char *wsk) // podobno unsigned mniej precyzyjne jest

{
	md5_state_t state;
	md5_byte_t digest[16];
	char hexoutput[16 * 2 + 1]; // tak bylo w md5main.c
	int di;
	md5_init(&state);
	md5_append(&state, (const md5_byte_t *)txt, strlen(txt));
	md5_finish(&state, digest);
for(di = 0; di < 16; ++di)
	sprintf(hexoutput + di * 2, "%.2x", digest[di]);


*wsk = hexoutput; // helpers.cpp:108:8: error: invalid conversion from ‘char*’ to ‘char’ [-fpermissive]

wsk = hexoutput; // zwraca 0
strcpy(wsk, hexoutput); // zadziałało, ale zwraca 32 znaki, pomimo tego, ze char ma pojemność 16, chyba, że mam zrobić 8
	}

(arekk-99) #4

Może mi ktoś wyjaśnić, dlaczego po przerobieniu tego kodu z C# a przynajmniej próbach dokonania tego w ogóle nic mi nie działą?
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <dirent.h>
#include “headers/helpers.h”
#include <stdlib.h>
#include <time.h>
int main()
{
int count;
FILE* f;
if ((f = fopen(“full.zpf”, “wb”)) == NULL) {
perror(“Wystąpił problem z otworzeniem pliku”);
return 1;
}
struct dirent* pl;
DIR* dir;
char lista[256][256];
if ((dir = opendir(“audio”))) {
int iindex = 0;
while ((pl = readdir(dir))) {
if ((pl->d_name != “.”) || (pl->d_name != “…”)) {
strcpy(lista[iindex], pl->d_name);
iindex++;
count = iindex;
}
}
}
closedir(dir);
int ver = 1;
int flags = 0;
fwrite(&ver, sizeof(int), 1, f);
fwrite(&flags, sizeof(int), 1, f);
fwrite(&count, sizeof(int), 1, f);
printf(“Wersja: %i Flagi: %i Pliki: %i”, ver, flags, count);
int si32 = 4;
int sh = 16;
int fis = (si32 * 2 + sh);
int ind = si32 * 3 + fis * count;
unsigned char md5[sh][count];
FILE* flog = fopen(“out.txt”, “a”);
for (int i = 0; i < count; i++) {
if (strcmp(lista[i], “.”) != 0 || strcmp(lista[i], “…”) != 0) {
calcMd5(lista[i], md5[i]);
fprintf(flog, “%s”, md5[i]);
fwrite(&md5[i], sizeof(unsigned char), 32, f);
char aind[128];
sprintf(aind, “%i”, ind);
fwrite(&ind, sizeof(int), strlen(aind), f);
char buf[1024];
sprintf(buf, “audio/%s”, lista[i]);
fprintf(flog, “%s”, buf);
FILE* fdata = fopen(buf, “rb”);
if (fdata == NULL) {
perror(“Wystąpił problem podczas otwierania pliku do odczytu…”);
return 1;
}
fpos_t dl;
fseek(fdata, 0, SEEK_END);
fgetpos(fdata, &dl);
char adl[128];
sprintf(adl, “%d”, dl);
size_t dll = (size_t)atoi(adl);
fwrite(&dl, sizeof(size_t), dll, f);
fprintf(flog, “%i”, dll);
ind += (int)dll;
fprintf(flog, “%i”, ind);
char* data;
memset(&data, 0, dll);
fread(&data, (size_t)dll, 1, fdata);
fwrite(&data, sizeof(char), dll, f);
fclose(fdata);
}
}
fclose(f);

return 0;

}