Skocz do zawartości

C++ Zapis Do Pliku A Ochrona Pamięci


Atom

Rekomendowane odpowiedzi

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 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

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

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

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ę
×
×
  • Dodaj nową pozycję...