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

tablica struktur

VPS Starter Arubacloud
0 głosów
518 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,780 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,290 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,780 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ź 237 wizyt
pytanie zadane 21 sierpnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
2 odpowiedzi 489 wizyt
pytanie zadane 4 maja 2019 w C i C++ przez inny_sub Obywatel (1,120 p.)
0 głosów
1 odpowiedź 257 wizyt
pytanie zadane 30 grudnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...