Wiki Page Content

Differences between revisions 12 and 13
Revision 12 as of 2015-06-20 19:54:22
Size: 2181
Comment: Added links to SDL_RWops.
Revision 13 as of 2015-08-19 08:38:32
Size: 2967
Comment: Add complete file reading example
Deletions are marked like this. Additions are marked like this.
Line 15: Line 15:
}}}

Read a complete file in memory (assuming size can be detected) (from [[https://gitlab.com/wikibooks-opengl/modern-tutorials/blob/master/common-sdl2/shader_utils.cpp|OpenGL WikiBook]]):
{{{#!highlight cpp
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;
}

SDL_RWread

Use this function to read from a data source.

Syntax

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

Read a complete file in memory (assuming size can be detected) (from 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;
}

Function Parameters

context

a pointer to an SDL_RWops structure

ptr

a pointer to a buffer to read data into

size

the size of each object to read, in bytes

maxnum

the maximum number of objects to be read

Return Value

Returns the number of objects read, or 0 at error or end of file; call SDL_GetError() for more information.

Code Examples

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);
}

Remarks

This function reads up to maxnum objects each of size size from the data source to the area pointed at by ptr. This function may read less objects than requested. It will return zero when there has been an error or the data stream is completely read.

SDL_RWread is actually a macro that calls the SDL_RWops's read method appropriately, to simplify application development.

More Examples

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

This will read 40 bytes of data, and put it into 'buffer', which is intended to hold 32-bit integers. Each Uint32 is 4 bytes, or 32-bits.

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

This will read 80 bytes of data, and place them into 'buffer', which is now designed for 64-bit integers (Uint64 values). Each Uint64 (long) is 8 bytes, and we are reading 10 of them (as shown by buffer[10] when we make it).


CategoryAPI, CategoryIO

None: SDL_RWread (last edited 2015-09-17 21:55:16 by PhilippWiesemann)

(Page Info.)
Feedback
Please include your contact information if you'd like to receive a reply.
Submit