Atom Napisano Wrzesień 13, 2009 Zgłoszenie Share Napisano Wrzesień 13, 2009 (edytowane) Witam przesiadłem się świeżo z Windowsa na Fedorę 11. Podczas pisania programu napotkałem na przeszkodę ponieważ mój zapis do pliku którym od lat posługiwałem się na Windowsie na fedorze narusza ochronę pamięci. Zawsze wypisze tylko jedną pozycje i wysypie sie bład. błąd /usr/local/netbeans-6.7.1/dlight1/bin/nativeexecution/dorun.sh: line 51: 735 Naruszenie ochrony pamięci /bin/sh "${PIDFILE}.sh" Zapis void zapis(dane tab[], int n,int &kasac) { FILE *fp; fp = fopen("baza.atom", "w"); fwrite(&n, sizeof (n), 1, fp); fwrite(&kasac, sizeof (kasac), 1, fp); for (int i = 0; i < n; i++) { fwrite(&tab[i], sizeof (dane), 1, fp); } fclose(fp); } I drugie pytanie czy ten sposób jest właściwy czy są raczej lepsze metody zapisu danych do pliku ?? Edytowane Wrzesień 13, 2009 przez Atom Ortografia. Gdy mówimy o leprze większość z nas ma na myśli chorobę zwaną też trądem ;) Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Wrzesień 13, 2009 Zgłoszenie Share Napisano Wrzesień 13, 2009 nie wiem jak wygląda reszta, która dokładnie linijka powoduje błąd, ani jakiego typu dane są zrzucane, ale... nie prościej by Ci było przekazać w funkcji wskaźnik, a nie ta kombinacja z & (co moim zdaniem jest przyczyną błędu ). void zapis(dane tab[], int * n, int * kasac) i dalej posługujesz się zwyczajnymi literkami, czasem tylko kombinując. Naruszenie ochrony pamięci, jest chyba wtedy jak odwołujesz się do nieznanego fragmentu pamięci, co by wskazywało na niewłaściwy wskaźnik/alokację. Generalnie trudno coś powiedzieć nie wiedząc z jakimi danymi ta funkcja jest wywołana. A metody zapisu są takie jak Ci odpowiadają. Tu zrzucasz cały blok, możesz też formatować wyjście przez fprintf (chyba najprostszy sposób ) http://www.cplusplus.com/reference/clibrary/cstdio/ albo zrobić zapis binarny http://4programmers.net/C/Artyku%C5%82y/Od...binarnych_w_Cpp co komu potrzebne Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Atom Napisano Wrzesień 13, 2009 Autor Zgłoszenie Share Napisano Wrzesień 13, 2009 Moje niedopatrzenie tego ampersandu nie powinno być tam bo nie przekazuje w funkcji tego parametru dalej. Ale jeżeli istnieje to nie spowoduje to błędu z powodu tego iż informuje to kompilator ze zmienna będzie przekazywana dalej. Tak ja to rozumie. Kolejną rzeczą jaką nie zwróciłem uwagi to sam zapis działa bodajże poprawnie. Działam na strukturze więc jedna komórka w tabeli zajmuje cała struktura. Podczas zapisu nic się nie wysypuje. Wyświetlenie całej bazy jest ok ale to mało ważne ponieważ ja wyświetlam to co mam w pamięci bo pracuje na pamięci a nie na pliku. Klocki są wtedy jak wyłączę program. Załadowanie pliku przechodzi poprawnie ale jeśli będę chciał wyświetlić bazę wtedy dostaje taki błąd. A to czy ja przekazuje zmienne przez referencje czy przez wskaźnik nie ma różnicy to tylko inny zapis i tyle i inaczej się troszkę buduje taką funkcje i tyle. Takie moje zdanie oczywiście. I dziękuje za te opcje zapisu. Przeanalizuje je Struktura struct dane { char gracz[20]; int kasa; time_t czasd; time_t czasp; }; Odczyt void Odczyt(dane tab[], int &n, int &kasac) { FILE *fp; if ((fp = fopen("baza.atom", "r")) == NULL) { cout << "\nNie odnaleziono bazy danych. Baza zostala utworzona.\n\n"; fp = fopen("baza.atom", "w"); } else { fread(&n, sizeof (n), 1, fp); fread(&kasac, sizeof (kasac), 1, fp); for (int i = 0; i < n; i++) fread(&tab[i], sizeof (tab[i]), 1, fp); } fclose(fp); } Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się