diff --git a/include/sparse.h b/include/sparse.h
index 9eca9df657ec80663132d5cb13c026b7ed9b9839..96c9bd7dffc7a7bae5bdf9244c411840e542699f 100644
--- a/include/sparse.h
+++ b/include/sparse.h
@@ -81,8 +81,8 @@ struct Sparse_ChunkHeader
 struct Sparse_Chunk
 {
     struct Sparse_ChunkHeader header;
-    size_t size;
-    size_t offset; // Data start location
+    size_t size;   // Data size
+    size_t offset; // Data offset
     char * data;
 };
 /*------------------------------------------------------------------------------
@@ -116,6 +116,10 @@ void Sparse_ReadHeader(struct Sparse * const sparse);
     Sparse_ReadChunksHeader()
 ------------------------------------------------------------------------------*/
 void Sparse_ReadChunksHeader(struct Sparse * const sparse);
+/*------------------------------------------------------------------------------
+    Sparse_Read()
+------------------------------------------------------------------------------*/
+void Sparse_Read(struct Sparse * const sparse);
 /*------------------------------------------------------------------------------
     Sparse_PrintHeader()
 ------------------------------------------------------------------------------*/
diff --git a/src/sparse.c b/src/sparse.c
index a8ba503e120ae6438b712d3572931c2fc387d154..d0b78ff7bb4270f744566b77e558b7f8cc0430eb 100644
--- a/src/sparse.c
+++ b/src/sparse.c
@@ -144,6 +144,33 @@ void Sparse_ReadChunksHeader(struct Sparse * const sparse)
         exit(-1);
     }
 }
+/*------------------------------------------------------------------------------
+    Sparse_Read()
+------------------------------------------------------------------------------*/
+void Sparse_Read(struct Sparse * const sparse)
+{
+    assert(sparse != NULL);
+    Sparse_ReadHeader(sparse);
+    Sparse_ReadChunksHeader(sparse);
+    int fd = sparse->fd;
+    for(size_t i = 0; i < sparse->header.chunk_count; i++) {
+        size_t data_size = sparse->chunks[i].size;
+        sparse->chunks[i].data = malloc(data_size);
+        if(sparse->chunks[i].data != NULL) {
+            FIO_Seek(fd, sparse->chunks[i].offset, SEEK_SET);
+            size_t read_size = sparse->chunks[i].size;
+            size_t bytes_read = FIO_Read(fd, sparse->chunks[i].data, read_size);
+            Log_Debug(&s_logger, "read_size = %zu | bytes_read = %zu\n", read_size, bytes_read);
+            if(bytes_read != read_size) {
+                Log_Fatal(&s_logger, "FIO_Read(%d) failed! %s\n", fd, strerror(errno));
+                exit(-1);
+            }
+        } else {
+            Log_Fatal(&s_logger, "malloc() : %s\n", strerror(errno));
+            exit(-1);
+        }
+    }
+}
 /*------------------------------------------------------------------------------
     Sparse_PrintHeader()
 ------------------------------------------------------------------------------*/