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

tablica struktur

Object Storage Arubacloud
0 głosów
568 wizyt
pytanie zadane 12 listopada 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

struct point_t
{
    int x;
    int y;
};

int save_points_b(const char *filename, const struct point_t* p, unsigned int N)
{
    int zmienna = N;
    if(filename == NULL || p == NULL || zmienna <= 0)
    {
        return 1;
    }
    FILE *plik;
    plik = fopen(filename, "wb");
    if(plik == NULL)
    {
        return 2;
    }
    int i = 0;
    for(i = 0; i < zmienna; i++)
    {
        fprintf(plik, "%d ", (p+i)->x);
        fprintf(plik, "%d\n", (p+i)->y);
    }
    fclose(plik);
    return 0;
}

struct point_t* read(struct point_t* p)
{
    if(p == NULL)
    {
        return NULL;
    }
    int x = 0;
    int y = 0;
    printf("Podaj x i y: ");
    if(scanf("%d %d", &x, &y) != 2)
    {
        goto koniec;
    }
    (*p).x = x;
    (*p).y = y;
    return p;
    koniec:
    return NULL;
}

int main()
{
    int liczba = 0;
    struct point_t a[10001] = {0};
    struct point_t *p = a;
    char tab[31] = {0};

    printf("Podaj liczbe: ");
    scanf("%d", &liczba);
    for(int i = 0; i < liczba; i++)
    {
        if(read(p+i) == NULL)
        {
            printf("Incorrect input");
            return 1;
        }
    }
    printf("Podaj nazwe pliku: ");
    scanf("%30s[^\n]", tab);
    save_points_b(tab, p, liczba);
    return 0;
}

Oto mój kod. Z pobieraniem liczb wszystko jest dobrze. Problem pojawia się we wpisywaniu danych do pliku. Program do testowania zadania pokazuje błąd "Liczba danych zapisana do pliku powinna być wielokrotnością 4 bajtów" . Nie jestem sobie w stanie z tym poradzić, błagam o pomoc

1
komentarz 12 listopada 2020 przez tangarr Mędrzec (154,860 p.)
Plik ma być binarny czy tekstowy?
Otwierasz go w trybie binarnym, a wpisujesz do niego dane tekstowe.
komentarz 12 listopada 2020 przez ResCrove Obywatel (1,700 p.)
binarny
1
komentarz 12 listopada 2020 przez Oscar Nałogowiec (29,320 p.)
To użyj fwrite zamiast fprintf. Oczywiście też fread zamiast fscanf.

Wywal też goto. Od razu w tym miejscu daj return.
komentarz 12 listopada 2020 przez ResCrove Obywatel (1,700 p.)
Oooo dziękuję bardzo fwrite rozwiązał mój problem :D

1 odpowiedź

+2 głosów
odpowiedź 12 listopada 2020 przez tangarr Mędrzec (154,860 p.)
wybrane 12 listopada 2020 przez ResCrove
 
Najlepsza
Jeżeli używasz pliku binarnego to nie powinieneś zapisywać do niego danych w formacie tekstowym.
Musisz zapisać liczbę tak jak jest ona reprezentowana w pamięci a nie w postaci czytelnej dla użytkownika.
Liczba typu int zajmuje 4 bajty (na komputerach bazujących na architekturze x86) niezależnie od jej wartości.

Do zapisu binarnego używa się funkcji write (oraz pokrewnych). Funkcja przyjmuje adres zmiennej/struktury którą chcesz zapisać oraz jej rozmiar w bajtach.

Podobne pytania

0 głosów
1 odpowiedź 247 wizyt
pytanie zadane 21 sierpnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
2 odpowiedzi 508 wizyt
pytanie zadane 4 maja 2019 w C i C++ przez inny_sub Obywatel (1,120 p.)
0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 30 grudnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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!

...