C - fpritnf ze struktury

C - fpritnf ze struktury
B2
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • 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;
}
edytowany 2x, ostatnio: kq
Sparrow-hawk
U mnie zapisuje się wszystko. Może patrzysz na niewłaściwy plik?
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:minuta
  • Lokalizacja:Szczecin
1

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


B2
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • 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;
}
edytowany 2x, ostatnio: bojarek23
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
3

fscanf :-)


kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:minuta
  • 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.


edytowany 1x, ostatnio: kq
B2
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • 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
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:minuta
  • 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 &.


edytowany 1x, ostatnio: kq
Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
2

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

edytowany 1x, ostatnio: Sparrow-hawk
B2
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • 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.