The following example will read a binary in full and store it to a buffer in memory.
[download id=”2487″]
We used the custom structure binary_data_t to store the data information.
This structure stores the pointer to the data and their size.
struct binary_data_t {
long size;
void *data;
};
In main.cpp we performed three tests
- Reading a file that exists and is not empty
- Reading a non-existing file
- Reading an empty file
[download id=”2487″]
file_helpers.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #ifndef GM_S_LITTLE_HELPERS_FILE_HELPERS_H#define GM_S_LITTLE_HELPERS_FILE_HELPERS_H#ifdef __cplusplusextern "C" {#endiftypedef struct binary_data_t binary_data_t;struct binary_data_t { long size; void *data;};binary_data_t * read_file(const char *filename);#ifdef __cplusplus}#endif#endif //GM_S_LITTLE_HELPERS_FILE_HELPERS_H |
file_helpers.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <stdio.h>#include <malloc.h>#include "file_helpers.h"//Returns a binary_data_t structure if reading the file was OK.//In case of an error it always returns NULL.binary_data_t *read_file(const char *filename) { //Allocated our binary data structure binary_data_t *binary_data = malloc(sizeof(binary_data_t)); if (binary_data != NULL) { binary_data->size = 0; void *buffer = NULL; long position; //Open the file for reading in binary mode FILE *fIn = fopen(filename, "rb"); if (fIn != NULL) { //Go to the end of the file const int fseek_end_value = fseek(fIn, 0, SEEK_END); if (fseek_end_value != -1) { //Get the current position in the file (in bytes) position = ftell(fIn); if (position != -1) { //Go back to the beginning of the file const int fseek_set_value = fseek(fIn, 0, SEEK_SET); if (fseek_set_value != -1) { //Allocate enough space to read the whole file buffer = malloc(position); if (buffer != NULL) { //Read the whole file to buffer const long size = fread(buffer, 1, position, fIn); if (size == position) { binary_data->size = position; binary_data->data = buffer; fclose(fIn); return binary_data; } free(buffer); } } } } fclose(fIn); } free(binary_data); } return NULL;} |
main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream>#include "file_helpers.h"int main(int argc, char *argv[]) { //Testing a non-zero sized file //read_file() will return a binary_data_t where size will be non zero binary_data_t *binary_data_non_zero = read_file(argv[0]); //Testing for a non-existing file //read_file() will return a NULL pointer binary_data_t *binary_data_not_existing = read_file("some file that does not exist..."); const char * filename = "/tmp/some_empty_file"; //Creating an empty file FILE * fout = fopen(filename, "w"); fclose(fout); //Testing for an empty file //read_file() will return a binary_data_t where size will be zero binary_data_t *binary_data_empty = read_file(filename); return EXIT_SUCCESS;} |
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(GM_s_Little_Helpers)
set(CMAKE_CXX_STANDARD 11)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
set(SOURCE_FILES main.cpp file_helpers.c file_helpers.h)
add_executable(GM_s_Little_Helpers ${SOURCE_FILES})
target_link_libraries(GM_s_Little_Helpers)
[download id=”2487″]
This post is also available in: Greek



Thank you, you saved me hours. The quality is astounding.