Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Uaktualniono: 31.07.2022

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

Interfejs SDL2:

SDL_RWread

SPIS TREŚCI

Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.

SDL_RWread

Użyj tej funkcji, aby odczytać dane ze strumienia.

Składnia

size_t SDL_RWread(struct SDL_RWops* context,
                  void*             ptr,
                  size_t            size,
                  size_t            maxnum)

Parametry funkcji

context wskaźnik do struktury SDL_RWops.
ptr wskaźnik bufora, do którego zostaną wprowadzone odczytane dane.
size rozmiar w bajtach każdego obiektu do odczytania.
maxnum maksymalna liczba obiektów do odczytania.

Wartość zwracana

Zwraca liczbę odczytanych obiektów lub 0 przy błędzie lub końcu pliku; wywołaj funkcję SDL_GetError(), aby otrzymać więcej informacji na temat błędu.

Przykładowy kod

SDL_RWops *rw = SDL_RWFromFile("test.bin","r");
if (rw != NULL)
{
    extern Uint8 buf[256];
    SDL_RWread(rw, buf, sizeof (buf), 1);
    SDL_RWclose(rw);
}
Odczyt pełnego pliku do pamięci (przy założeniu, że można odczytać jego rozmiar) (z OpenGL WikiBook):
char* file_read(const char* filename)
{
    SDL_RWops *rw = SDL_RWFromFile(filename, "rb");
    if (rw == NULL) return NULL;

    Sint64 res_size = SDL_RWsize(rw);
    char* res = (char*)malloc(res_size + 1);

    Sint64 nb_read_total = 0, nb_read = 1;
    char* buf = res;
    while (nb_read_total < res_size && nb_read != 0)
    {
        nb_read = SDL_RWread(rw, buf, 1, (res_size - nb_read_total));
        nb_read_total += nb_read;
        buf += nb_read;
    }
    SDL_RWclose(rw);
    if (nb_read_total != res_size)
    {
        free(res);
        return NULL;
    }

    res[nb_read_total] = '\0';
    return res;
}

Uwagi

Funkcja ta odczytuje obiekty maksymalnie do podanej ich liczby w parametrze maxnum, z których każdy posiada rozmiar w bajtach określony w parametrze size, ze źródła danych do obszaru wskazanego przez parametr ptr. Funkcja może odczytać mniej obiektów niż zażądano. Zwróci zero, gdy wystąpił błąd lub strumień danych został wcześniej w całości odczytany.

SDL_RWread() jest w rzeczywistości makrem, które odpowiednio wywołuje metodę odczytu strumienia SDL_RWops, aby uprościć tę operację w aplikacji.

Dalsze przykłady

Uint32 buffer[10];
SDL_RWread(rwop, buffer, sizeof(Uint32), 10);

To odczyta 40 bajtów danych i umieści je w buforze  'buffer', który został przygotowany do przechowywania 32-bitowych liczb całkowitych. Każda liczba typu Uint32 ma długość 4 bajtów, czyli 32-bitów

Uint32 buffer[10];
SDL_RWread(rwop, buffer, sizeof(Uint64), 10);

To odczyta 80 bajtów danych i umieści je w buforze 'buffer', który jest zaprojektowany teraz do przechowywania 64-bitowych liczb całkowitych (wartości typu Uint64). Każda liczba Uint64 ma długość 8 bajtów, a my odczytujemy ich 10 (co pokazuje definicja  buffer[10] przy jego tworzeniu).

Powiązane funkcje

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2023 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.