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

Zapis do pliku - C

Object Storage Arubacloud
0 głosów
330 wizyt
pytanie zadane 19 stycznia 2021 w C i C++ przez forvev Początkujący (390 p.)

Cześć wszystkim,
Przechodząc do sedna sprawy, mój problem leży w 62 linii. Nie mogę zrozumieć czemu wyskakuje mi ostrzeżenie jakobym porównywał wskaźnik z liczbą całkowitą. Dodatkowo mógłby ktoś sprawdzić, czy dobrze operuję na pamięci w fwrite oraz fread. 

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

struct produkt{
    char nazwa[22];
    float cena;
    char firma[22];
}*pr;

struct produkt wczytaj(int n, FILE *p);
void wyswietl(struct produkt *pr, FILE *p);
void oblicz(struct produkt *pr, int prowizja, int n);

int main(){
    setlocale(LC_ALL, "polish");
    int n;
    float prowizja;
    printf("Ile produktów chcesz wyznaczyæ?");
    scanf("%d", &n);
    printf("Podaj prowizje w %%: ");
    scanf("%f", &prowizja);

    pr = (struct produkt*)malloc(n*sizeof(struct produkt));

    FILE *p;
    if((p = fopen("               ", "wb"))==NULL){
        puts("Nie mozna otworzyc pliku. ");
        return 1;
    }
    *pr = wczytaj(n, p);
    fclose(p);

    if((p = fopen("                           ", "rb"))==NULL){
        puts("Nie mozna otworzyc pliku. ");
        return 1;
    }
    wyswietl(pr, p);
    fclose(p);
    oblicz(pr, prowizja, n);

    return 0;
}
struct produkt wczytaj(int n, FILE *p){
    int i;
    for(int i=0; i<n; i++){
        fflush(stdin);
        printf("Nazwa produktu: "); gets((pr+i)->nazwa);
        fflush(stdin);
        printf("cena: "); scanf("%f", &(pr+i)->cena);
        fflush(stdin);
        printf("firma: "); gets((pr+i)->firma);
        fwrite((pr+i), sizeof(*pr),1 , p);

    }
    return *pr;
};

void wyswietl(struct produkt *pr, FILE *p){
    int i=0;
    printf("\nDane produktu: ");
    while(fread(pr+i, sizeof(*pr), 1, p)!= NULL){
        printf("\nNazwa produktu: "); puts((pr+i)->nazwa);
        printf("Cena: %.2f", (pr+i)->cena);
        printf("\nfirma: "); puts((pr+i)->firma);
        i++;
    }
}

void oblicz(struct produkt *pr, int prowizja, int n){
    float p=0;
    int i;
    for(i=0; i<n; i++){
        p = (pr+i)->cena*(1-((float)prowizja/100));
        p =(pr+i)->cena-p;
        printf("\nDla produktu \"%s\" prowizja wynosi : %.2f z³", (pr+i)->nazwa, p);
    }
}

 

1 odpowiedź

+1 głos
odpowiedź 19 stycznia 2021 przez j23 Mędrzec (194,920 p.)

fread zwraca wartość typu size_t, a NULL jest typu wskaźnikowego.

komentarz 19 stycznia 2021 przez forvev Początkujący (390 p.)
Widzę dwie opcje, albo zrobić rzutowanie, albo zmienić zapis danych do tego pliku... Dobrze zmierzam ?
komentarz 19 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Żadne rzutowanie, po prostu daj 0 zamiast NULL.

komentarz 19 stycznia 2021 przez forvev Początkujący (390 p.)
A w tych funkcjach fwrite oraz fread dobrze operuje na pamięci? Bo też miałem plan aby w size of zająć rozmiar całej struktury(sizeof(struct produkt)), ale wydaje mi się, że jest to niewłaściwe.
komentarz 19 stycznia 2021 przez j23 Mędrzec (194,920 p.)

sizeof(*pr) to jest samo co sizeof(struct produkt).

Po co w wyswietl czytasz z pliku, skoro masz już te dane wczytane w tablicy.

komentarz 19 stycznia 2021 przez forvev Początkujący (390 p.)
Ponieważ takie jest polecenie zadania. Dziękuję bardzo pomoc!
komentarz 19 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Zatem użycie tablicy jest zbędne. Wystarczy tak:

void wyswietl(FILE *p)
{
    struct produkt prod;

    printf("\nDane produktu: \n");
    
    rewind(p);
    
    while(fread(&prod, sizeof(prod), 1, p) == 1) {
        printf("Nazwa produktu: %s\n", prod.nazwa);
        printf("Cena: %.2f\n", prod.cena);
        printf("firma: %s\n", prod.firma);
    }
}

 

Podobne pytania

0 głosów
3 odpowiedzi 477 wizyt
pytanie zadane 27 kwietnia 2019 w C i C++ przez miodowy Nowicjusz (120 p.)
0 głosów
1 odpowiedź 346 wizyt
pytanie zadane 20 września 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 222 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...