C - fpritnf ze struktury

C - fpritnf ze struktury
B2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
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?

Kopiuj
#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;
}
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

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

B2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
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?

Kopiuj
#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;
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
3

fscanf :-)

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
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.

B2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
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);

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
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.

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

nazwa celowo bez &.

Sparrow-hawk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Katowice
  • Postów: 189
2

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

B2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.