• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem - zapis do pliku - C

VPS Starter Arubacloud
0 głosów
190 wizyt
pytanie zadane 7 listopada 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)

Hejka. Chciałabym się Was zapytać, czy coś jest nie tak w kodzie, że program po zapisaniu danych do pliku, po otwarciu go posiada takie coś? "­l_v°@ Ě˙a 124 0.000000"
Kod jest na tą chwilę następujący:
 

#include <stdlib.h>
#include <stdio.h>
#define PLIK "plik.txt"

typedef struct
{
    char nazwisko[20], imie[20];
    int rok_ur;
    float srednia;
} TDane;

typedef struct
{
    TDane d;
    struct TElement* next;
} TElement;

typedef TElement* TWsk;

int WprowadzStudenta(TDane *x);
int WyswietlStudenta(TDane x);
int NaStos(TWsk *P, TDane x);
int ZeStosu(TWsk *P, TDane *x);
int WprowadzDane(TWsk *P);
int UsunStos(TWsk *P);
int WyswietlStos(TWsk P);
float ZwrocSrednia(TWsk P);
int NajwiekszyElement(TWsk P);

int main()
{
    FILE *pliczek;
    TDane x;
    TWsk P;
    P=NULL;
    WprowadzDane(&P);
    printf("\nWprowadzono nastepujace dane: \n");
    printf("Srednia: %.2f\n", ZwrocSrednia(P));
    printf("Najwiekszy element: %d\n", NajwiekszyElement(P));
    UsunStos(&P);
    pliczek = fopen(PLIK, "w");
    fprintf(pliczek, "%s %s %d %f", x.imie, x.nazwisko, x.rok_ur, x.srednia);
    fclose(pliczek);
    return 0;
}

int WprowadzStudenta(TDane *x)
{
    printf("Podaj nazwisko: ");
    scanf("%s", x->nazwisko);
    printf("Podaj imie: ");
    scanf("%s", x->imie);
    printf("Podaj rok urodzenia: ");
    scanf("%d", &x->rok_ur);
    printf("Podaj srednia: ");
    scanf("%f", &x->srednia);
    return 0;
}

int WyswietlStudenta(TDane x)
{
    printf("%s %s %d %4.2f\n", x.nazwisko, x.imie, x.rok_ur, x.srednia);
    return 0;
}

int NaStos(TWsk *P, TDane x)
{
    TWsk Q;
    Q=(TElement*)malloc(sizeof(TElement));
    Q->d=x;
    Q->next=(*P);
    (*P)=Q;
    return 0;
}

int ZeStosu(TWsk *P, TDane *x)
{
    TWsk Q;
    if(P!=NULL)
    {
        Q=(*P);
        *x=Q->d;
        (*P)=Q->next;
        free(Q);
    }
    return 0;
}

int WprowadzDane(TWsk *P)
{
    int n, i;
    TDane x;
    printf("Dane ilu osob chcesz wprowadzic?: ");
    scanf("%d", &n);
    for(i=1; i<=n; i++)
    {
        printf("%d osoba: \n", i);
        WprowadzStudenta(&x);
        NaStos(&(*P), x);
    }
    return 0;
}

int UsunStos(TWsk *P)
{
    TDane x;
    while((*P)!=NULL)
    {
        ZeStosu(&(*P), &x);
        WyswietlStudenta(x);
    }
    return 0;
}

int WyswietlStos(TWsk P)
{
    while (P!=NULL)
    {
        WyswietlStudenta(P->d);
        P=P->next;
    }
    return 0;
}

float ZwrocSrednia(TWsk P)
{
    float sum_srednia = 0.f;
    int ilosc = 0;
    while(P!= NULL){
        sum_srednia += P->d.srednia;
        ++ilosc;
        P = P->next;
    }
    if( ilosc == 0)
        return 0.f;

    return  sum_srednia/ilosc;
}

int NajwiekszyElement(TWsk P)
{
    int najwiekszy = 0;
    int ile = 0;
    while(P!=NULL)
    {
        if(P->d.rok_ur>najwiekszy)
        najwiekszy = P->d.rok_ur;
        ++ile;
        P = P->next;
    }
    if(ile==0)
    {
        printf("Brak najwiekszego elementu!");
        return 0;
    }

    return najwiekszy;
}

Byłabym bardzo wdzięczna za pomoc. :)

1 odpowiedź

0 głosów
odpowiedź 7 listopada 2018 przez criss Mędrzec (172,590 p.)
Wpisujesz do pliku zawartość obiektu `x` z maina, ale nie widze, żebyś cokolwiek robiła z tym x w kodzie. Tzn. `x` zawiera niezainicjalizowane w żaden sposób dane.
komentarz 7 listopada 2018 przez gorgonkowa Obywatel (1,810 p.)
Hmm... czyli tutaj w mainie jeszcze powinnam coś dodać z obiektu 'x'? Tak średnio zrozumiałam :P
komentarz 7 listopada 2018 przez criss Mędrzec (172,590 p.)

Zapisujesz `x` do pliku. Ale skąd masz wiedzieć co zostanie zapisane do pliku skoro `x` jest przez ciebie zupełnie nietknięty w programie.

czyli tutaj w mainie jeszcze powinnam coś dodać z obiektu 'x'? 

Ja nie wiem co ty chcesz osiągnąć, ale mi się ten zapis do pliku wydaje bez sensu skoro nie wiesz co zapisujesz. 

komentarz 7 listopada 2018 przez gorgonkowa Obywatel (1,810 p.)
Hmm rozumiem. A czy mogłabym poprosić o jakieś małe naprowadzenie takie... typowo dla osoby, która to widzi po raz pierwszy na oczy? Chodzi generalnie tylko o to, żeby nauczyć się kodu na pamięć do kolokwium szczerze powiedziawszy, a koledzy nie chcą w niczym pomóc ani wytłumaczyć na roku, stąd jestem tutaj :/
komentarz 7 listopada 2018 przez criss Mędrzec (172,590 p.)
Generalnie kod nie jest niepoprawny, ale ten zapis do pliku troche bezsensowny :P Daj jakieś konkretniejsze pytania, bo szczerze to nie wiem jak mam cie naprowadzić ani na co
komentarz 7 listopada 2018 przez gorgonkowa Obywatel (1,810 p.)
Generalnie... masz rację, wyskakuje 5 warningów, ale mimo wszystko robi wszystko oprócz zapisu do pliku :P Ogólnie mam 5 poleceń. Dwa wspólnymi siłami z tym forum już są, wyznaczenie średniej arytmetycznej ocen wszystkich wprowadzonych studentów oraz znalezienie osoby najstarszej i najmłodszej byłoby.
Polecenie trzecie, o które tutaj chciałam spytać brzmi dosłownie "Zapisanie zawartości stosu do pliku oceny.dat". Tam zrobiłam zupełnie inny pliczek zdefiniowany, a dodatkowo nie mogę modyfikować kodu, tak sobie doktor zażyczył :P Kolejne zadanie będzie brzmiało "Umożliwienie pobrania danych z pliku o nazwie oceny.dat, umieszczenia ich na stosie, a następnie dodania do stosu danych n osób." Oraz ostatnie piąte "Znalezienie na stosie osób o podanym nazwisku i wyświetlenie ich danych na ekranie(w przypadku braku takich osób powinien się pojawić stosowny komunikat)"

Te wszystkie polecenia chciałabym jakoś w miarę ogarnąć do końca tygodnia :P
Ciężko Ci będzie ze mną Kolego :/
komentarz 7 listopada 2018 przez criss Mędrzec (172,590 p.)

"Zapisanie zawartości stosu do pliku oceny.dat"

Zrob sobie jakąś funkcje wypisującą do pliku obiekt TDane a potem przejdź po całym stosie używając tej funkcji (przez po całym tzn. tak długo aż `next` będzie NULL (w sumie dokładnie to co sie dzieje w WyswietlStos() )

Umożliwienie pobrania danych z pliku o nazwie oceny.dat, umieszczenia ich na stosie

 Użyj fscanf. 

Znalezienie na stosie osób o podanym nazwisku i wyświetlenie ich danych na ekranie(w przypadku braku takich osób powinien się pojawić stosowny komunikat)

 Tak jak wcześniej przechodzisz po całym stosie z tym, że jeśli natrafisz na szukane imie/nazwisko to sobie coś tam wypisujesz.

komentarz 8 listopada 2018 przez gorgonkowa Obywatel (1,810 p.)

Hmm... coś mi to dało do myślenia, a mam pytanko, co do pierwszej wypowiedzi, żeby mieć funkcję wypisującą do pliku obiekt TDane, to przeważnie mam przedrostki, int, float, char, zaś tam mają być zarówno litery jak i cyfry, więc jaką tutaj funkcję zastosować?
 

void Zapisz(TDane x)
{
    while (x!=NULL)
    {
        fprintf(pliczek, "%s %s %d %f", x.imie, x.nazwisko, x.rok_ur, x.srednia);
        x=x->next;
    }
    return 0;
}

 

komentarz 8 listopada 2018 przez criss Mędrzec (172,590 p.)

to przeważnie mam przedrostki, int, float, char, zaś tam mają być zarówno litery jak i cyfry,

Nie rozumiem o co ci chodzi, ale teraz jest dobrze :P 

komentarz 8 listopada 2018 przez gorgonkowa Obywatel (1,810 p.)

Hmm no prawie hehe :P A co można zrobić z errorami, które blokują kompilowanie programu?
1) Invalid operands to binary != (have 'TDane {aka struct <anonymous>}' and 'void *')
2) 'pliczek' undeclared (first use in this function)
3) note: each undeclared identifier is reported only once for each function it appears in
4) invalid type argument of  '->' (have 'TDane {aka struct <anonymous>}')
5) warning: 'return' with a value, in function returning void
Tyle jest błędów z samej funkcji void Zapisz :P
Oprócz niej są jeszcze 5 warningów w całości kodu, każdy z warningów brzmi podobnie, dotyczą:
1) In function 'NaStos' warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
Dotyczy tej linijki:
 

    Q->next=(*P);

2) In function 'ZeStosu' warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
Dotyczy tej linijki:
 

(*P)=Q->next;

3) In function 'WyswietlStos' warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
Dotyczy tej linijki:
 

P=P->next;

4) In function 'ZwrocSrednia' warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
Dotyczy tej linijki:
 

P = P->next;

5) In function 'NajwiekszyElement' warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
Dotyczy tej linijki:
 

P = P->next;

Może to wszystko też ma jakiś związek z problemem zapisu danych do pliku? :P

Podobne pytania

0 głosów
1 odpowiedź 503 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez matiibal Użytkownik (620 p.)
0 głosów
2 odpowiedzi 1,298 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez nooblike Nowicjusz (120 p.)
0 głosów
1 odpowiedź 243 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...