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

Problem - zapis do pliku - C

0 głosów
59 wizyt
pytanie zadane 7 listopada 2018 w C i C++ przez gorgonek Użytkownik (990 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 (161,320 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 gorgonek Użytkownik (990 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 (161,320 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 gorgonek Użytkownik (990 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 (161,320 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 gorgonek Użytkownik (990 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 (161,320 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 gorgonek Użytkownik (990 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 (161,320 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 gorgonek Użytkownik (990 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ź 55 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez matiibal Początkujący (460 p.)
0 głosów
2 odpowiedzi 88 wizyt
pytanie zadane 1 stycznia w C i C++ przez nooblike Nowicjusz (120 p.)
0 głosów
1 odpowiedź 43 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez gorgonek Użytkownik (990 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

60,207 zapytań

105,878 odpowiedzi

219,908 komentarzy

32,423 pasjonatów

Przeglądających: 199
Pasjonatów: 7 Gości: 192

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...