C - fpritnf ze struktury

0

Próbuje zapisać podane do "produktu" dane w pliku tekstowym o nazwie podanej przy wywolywaniu programu, jednak mam problem gdyż w pliku nie zapisują sie wszystkie dane, a jedynie "pralka", co robię źle?

#include <stdio.h>
#include <stdlib.h>
#define N 21
typedef struct towar {
    unsigned int id;
    char nazwa[N];
    float cena;
} TOWAR;
int main(int argc, char* argv[])
{
    TOWAR produkt = {.nazwa = "pralka", .cena = 899.99, .id = 1 };
    TOWAR kopia_produkt;
    //
    FILE *plik, *kopia;
    plik = fopen(argv[argc - 1], "w+");
    if (!plik) {
        printf("Blad otwarcia pliku");
        exit(0);
    }
    fprintf(plik, "%u %s %f\n", produkt.id, produkt.nazwa, produkt.cena);
    fclose(plik);
    return 0;
}
1

Kod wygląda ok, może masz plik tylko do odczytu albo sprawdzasz inny plik?

0

Rzeczywiście, po skopiowaniu kodu do nowego projektu zadziałało. Teraz chciałbym odczytać dane z tego samego pliku i zapisać je do zmiennej kopia_produkt. I myślałem nad takim czymś, ale jednak nie działa. Gdzie tym razem leży błąd?

#include <stdio.h>
#include <stdlib.h>
#define N 21
typedef struct towar {
    unsigned int id;
    char nazwa[N];
    float cena;
} TOWAR;
int main(int argc, char* argv[])
{
    TOWAR produkt = {.nazwa = "pralka", .cena = 899.99, .id = 1 };
    TOWAR kopia_produkt;
    //
    FILE *plik;
    plik = fopen(argv[argc - 1], "w+");
    if (!plik) {
        printf("Blad otwarcia pliku");
        exit(0);
    }
    fprintf(plik, "%u %s %.2f\n", produkt.id, produkt.nazwa, produkt.cena);
    
	fread ( &kopia_produkt, sizeof (kopia_produkt), 1, plik);

printf("id: %u nazwa: %s cena %.2f zl",
kopia_produkt.id, kopia_produkt.nazwa, kopia_produkt.cena);
    
    fclose(plik);
    return 0;
}
3

fscanf :-)

3

Do pliku zapisałeś reprezentację tekstową struktury. A próbujesz wczytać ją jaką reprezentację binarną - to nie ma sensu. Albo zapisuj za pomocą fread i fwrite albo fprintf i fscanf. Mieszanie do niczego dobrego nie prowadzi, jak sam widzisz.

0

Czyli ma to mieć postać? Czy dalej robię coś źle?
fscanf(plik, "%u %s %.2f\n", kopia_produkt.id, kopia_produkt.nazwa, kopia_produkt.cena);

3

Funkcje z rodziny scanf oczekują wskaźników na elementy, które mają uzupełnić. Dodatkowo, dla ułatwienia double zapisujesz jako %f ale wczytujesz jako %lf.

fscanf(plik, "%u %s %lf\n", &kopia_produkt.id, kopia_produkt.nazwa, &kopia_produkt.cena);

nazwa celowo bez &.

2

Zapewne w twoim przypadku, przed odczytem należy wrócić na początek pliku. Poczytaj sobie o fseek.

0

Dzięki wielkie, teraz działa jak należy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1