• 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
58 wizyt
pytanie zadane 7 listopada w C i C++ przez gorgonek Początkujący (480 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 przez Criss Mędrzec (152,940 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 przez gorgonek Początkujący (480 p.)
Hmm... czyli tutaj w mainie jeszcze powinnam coś dodać z obiektu 'x'? Tak średnio zrozumiałam :P
komentarz 7 listopada przez Criss Mędrzec (152,940 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 przez gorgonek Początkujący (480 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 przez Criss Mędrzec (152,940 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 przez gorgonek Początkujący (480 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 przez Criss Mędrzec (152,940 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 przez gorgonek Początkujący (480 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 przez Criss Mędrzec (152,940 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 przez gorgonek Początkujący (480 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ź 46 wizyt
pytanie zadane 7 grudnia w C i C++ przez matiibal Początkujący (400 p.)
0 głosów
1 odpowiedź 41 wizyt
pytanie zadane 3 listopada w C i C++ przez gorgonek Początkujący (480 p.)
0 głosów
1 odpowiedź 58 wizyt
pytanie zadane 4 dni temu w Java przez Mateusz Jabłoński Nowicjusz (120 p.)
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

57,749 zapytań

102,788 odpowiedzi

212,080 komentarzy

29,696 pasjonatów

Przeglądających: 329
Pasjonatów: 8 Gości: 321

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.

...