Ĺadny brzuch
Podam najprostszy przykład, żeby nie mieszać:
struct test { char *c; int wiek; }zmienna;
W moim programie zamierzam użyć zmiennych:
char *a="Ala", *b="Magda";
"zmienna" ma zostać kilkakrotnie zapisana w pliku, z tym, że nie wiem jak zapisać do niej różnej długości teksty (raz a, raz b ). I jak to zapisać i odcytać z pliku? Bo przecież będą to dane różnych rozmiarów. Gdy sprawdzam wielkość struktury, to za każdym razem widzę: 8.
Użytkownik Loracius edytował ten post 15 kwiecień 2007, 22:07
struct test { char c[512]; int wiek; }zmienna;
Max 512 znaków - o to chodzi ?
No właśnie chodzi mi o uniknięcie takiego podejścia do sprawy, gdyż głównym celem jest oszczędność pamięci. Mój przyszły program może zawierać znacznie więcej (jak i wogóle) znaków. A plik wynikowy ma być możliwie najmniejszy.
char *p = new char[ile];
spróbuj z fscanf() i fprintf() -opis znajdziesz na googlach.
No właśnie chodzi mi o uniknięcie takiego podejścia do sprawy, gdyż głównym celem jest oszczędność pamięci. Mój przyszły program może zawierać znacznie więcej (jak i wogóle) znaków. A plik wynikowy ma być możliwie najmniejszy.
nie mozesz ich po prostu zapisywac wierszami ??
albo moze sprobuj fwrite()
Najprościej rzecz ujmując: nie wiem jak zapisać dynamicznie alokowaną pamięć zapisać do pliku, np. *char, liste... (i mam na myśli fwrite())
Najprościej rzecz ujmując: nie wiem jak zapisać dynamicznie alokowaną pamięć zapisać do pliku, np. *char, liste... (i mam na myśli fwrite())
zawsze mozez zrobic tak, ze w pliku na poczatku kazdego zapisanego bloku pamieci, bedziesz zapisywal takze liczbe, ktora bedzie zawierac liczbe bajtow do pobrania, ale chyba wtedy zapisywanie wierszami mniej zajmie, toz to tylko 2 bajty dla kazdego wiersza (pod windowsem, pod linuxem 1)
Użytkownik fernandez edytował ten post 16 kwiecień 2007, 16:26
Udało się :D
Do problemu podchodziłem kilka razy, ale teraz to czas naglił to i rozwiązanie pojawić się musiało. Podam je, gdyż nie doszukałem się tego w swoich wykładach i na googlach (no to raczej mało prawdopodobne, żeby tam bie było :P ). O takie coś mi dokładnie chodziło:
// PROGRAM DO ZAPISU int main(void) { char *imie1 = "Ala"; char *imie2 = "Magda"; char *imie3 = "Bonifacy13"; FILE *OFile; OFile = fopen("wynik", "wb"); do_pliku(&OFile, strlen(imie1), imie1, 7, 2); do_pliku(&OFile, strlen(imie2), imie2, 6, 5); do_pliku(&OFile, strlen(imie3), imie3, 16, 15); fclose(OFile); system("pause"); return 0; } void do_pliku(FILE **pFile, const int tekst, char *znaki, int poz, int ile) { struct paczka { int dl_tekstu; char c[tekst]; int poz_w_oknie, il_znak; }pack; int licznik; // Wypelnienie struktury pack.dl_tekstu = tekst; for(licznik = 0; licznik < tekst; licznik++) { pack.c[licznik] = *(znaki + licznik); } pack.poz_w_oknie = poz; pack.il_znak = ile; fwrite(&pack, sizeof(pack), 1, *pFile); }
Zbawienna jak zwykle okazało się: const int blaaaa.
Poniżej program do odczytu:
int main(void) { int dlugoscPliku; FILE *OFile; OFile = fopen("wynik", "rb"); fseek ( OFile, 0 , SEEK_END ); dlugoscPliku = ftell ( OFile ); fseek ( OFile, 0 , SEEK_SET ); printf("Dlugosc pliku = %d\n-------\n", dlugoscPliku); z_pliku(&OFile); z_pliku(&OFile); z_pliku(&OFile); fclose(OFile); system("pause"); return 0; } void z_pliku(FILE **pFile) { char *c; int dl, po, il, licznik; fread(&dl, sizeof(int), 1, *pFile); printf("Dlugosc tekstu: %d\n", dl); // Bo Dev-C++ zapisuje 4-bajtowymi blokami if(dl % 4 == 0) { // Alokacja na napis + na dodatkowy znak '' c = (char *) malloc(dl + 1); fread(c, sizeof(char), dl, *pFile); } else { // Alokacja na napis + na dodatkowy znak '' c = (char *) malloc(dl + (4 - dl % 4) + 1); fread(c, sizeof(char), dl + (4 - dl % 4), *pFile); } *(c + dl) = ''; printf("Imie: %s\n", c); free(c); fread(&po, sizeof(int), 1, *pFile); printf("Miejsce w oknie: %d\n", po); fread(&il, sizeof(int), 1, *pFile); printf("Przesuniecie: %d\n\n", il); }
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
struct test { char *c; int wiek; }zmienna;
W moim programie zamierzam użyć zmiennych:
char *a="Ala", *b="Magda";
"zmienna" ma zostać kilkakrotnie zapisana w pliku, z tym, że nie wiem jak zapisać do niej różnej długości teksty (raz a, raz b ). I jak to zapisać i odcytać z pliku? Bo przecież będą to dane różnych rozmiarów. Gdy sprawdzam wielkość struktury, to za każdym razem widzę: 8.
Użytkownik Loracius edytował ten post 15 kwiecień 2007, 22:07
struct test { char c[512]; int wiek; }zmienna;
Max 512 znaków - o to chodzi ?
No właśnie chodzi mi o uniknięcie takiego podejścia do sprawy, gdyż głównym celem jest oszczędność pamięci. Mój przyszły program może zawierać znacznie więcej (jak i wogóle) znaków. A plik wynikowy ma być możliwie najmniejszy.
char *p = new char[ile];
spróbuj z fscanf() i fprintf() -opis znajdziesz na googlach.
No właśnie chodzi mi o uniknięcie takiego podejścia do sprawy, gdyż głównym celem jest oszczędność pamięci. Mój przyszły program może zawierać znacznie więcej (jak i wogóle) znaków. A plik wynikowy ma być możliwie najmniejszy.
nie mozesz ich po prostu zapisywac wierszami ??
albo moze sprobuj fwrite()
Najprościej rzecz ujmując: nie wiem jak zapisać dynamicznie alokowaną pamięć zapisać do pliku, np. *char, liste... (i mam na myśli fwrite())
Najprościej rzecz ujmując: nie wiem jak zapisać dynamicznie alokowaną pamięć zapisać do pliku, np. *char, liste... (i mam na myśli fwrite())
zawsze mozez zrobic tak, ze w pliku na poczatku kazdego zapisanego bloku pamieci, bedziesz zapisywal takze liczbe, ktora bedzie zawierac liczbe bajtow do pobrania, ale chyba wtedy zapisywanie wierszami mniej zajmie, toz to tylko 2 bajty dla kazdego wiersza (pod windowsem, pod linuxem 1)
Użytkownik fernandez edytował ten post 16 kwiecień 2007, 16:26
Udało się :D
Do problemu podchodziłem kilka razy, ale teraz to czas naglił to i rozwiązanie pojawić się musiało. Podam je, gdyż nie doszukałem się tego w swoich wykładach i na googlach (no to raczej mało prawdopodobne, żeby tam bie było :P ). O takie coś mi dokładnie chodziło:
// PROGRAM DO ZAPISU int main(void) { char *imie1 = "Ala"; char *imie2 = "Magda"; char *imie3 = "Bonifacy13"; FILE *OFile; OFile = fopen("wynik", "wb"); do_pliku(&OFile, strlen(imie1), imie1, 7, 2); do_pliku(&OFile, strlen(imie2), imie2, 6, 5); do_pliku(&OFile, strlen(imie3), imie3, 16, 15); fclose(OFile); system("pause"); return 0; } void do_pliku(FILE **pFile, const int tekst, char *znaki, int poz, int ile) { struct paczka { int dl_tekstu; char c[tekst]; int poz_w_oknie, il_znak; }pack; int licznik; // Wypelnienie struktury pack.dl_tekstu = tekst; for(licznik = 0; licznik < tekst; licznik++) { pack.c[licznik] = *(znaki + licznik); } pack.poz_w_oknie = poz; pack.il_znak = ile; fwrite(&pack, sizeof(pack), 1, *pFile); }
Zbawienna jak zwykle okazało się: const int blaaaa.
Poniżej program do odczytu:
int main(void) { int dlugoscPliku; FILE *OFile; OFile = fopen("wynik", "rb"); fseek ( OFile, 0 , SEEK_END ); dlugoscPliku = ftell ( OFile ); fseek ( OFile, 0 , SEEK_SET ); printf("Dlugosc pliku = %d\n-------\n", dlugoscPliku); z_pliku(&OFile); z_pliku(&OFile); z_pliku(&OFile); fclose(OFile); system("pause"); return 0; } void z_pliku(FILE **pFile) { char *c; int dl, po, il, licznik; fread(&dl, sizeof(int), 1, *pFile); printf("Dlugosc tekstu: %d\n", dl); // Bo Dev-C++ zapisuje 4-bajtowymi blokami if(dl % 4 == 0) { // Alokacja na napis + na dodatkowy znak '' c = (char *) malloc(dl + 1); fread(c, sizeof(char), dl, *pFile); } else { // Alokacja na napis + na dodatkowy znak '' c = (char *) malloc(dl + (4 - dl % 4) + 1); fread(c, sizeof(char), dl + (4 - dl % 4), *pFile); } *(c + dl) = ''; printf("Imie: %s\n", c); free(c); fread(&po, sizeof(int), 1, *pFile); printf("Miejsce w oknie: %d\n", po); fread(&il, sizeof(int), 1, *pFile); printf("Przesuniecie: %d\n\n", il); }