C program to read the contents of a file into character buffer

Lets say we want to read the contents of some file and want to operate on these contents using C program. In this case, we first need to read the complete file into buffer and work on to this character buffer to do what we want to do.

Following c program, copied the contents of JSON file test_file.json into buffer and then dumps that buffer to stdout. [ You can do whatever you want which this bufffer ]

 $ vim read_file_to_buffer.c 
[bash] #include <stdio.h> #include <stdlib.h> #include <stdbool.h> /* * ‘slurp’ reads the file identified by ‘path’ into a character buffer * pointed at by ‘buf’, optionally adding a terminating NUL if * ‘add_nul’ is true. On success, the size of the file is returned; on * failure, -1 is returned and ERRNO is set by the underlying system * or library call that failed. * * WARNING: ‘slurp’ malloc()s memory to ‘*buf’ which must be freed by * the caller. */ long slurp(char const* path, char **buf, bool add_nul) { FILE *fp; size_t fsz; long off_end; int rc; /* Open the file */ fp = fopen(path, "r"); if( NULL == fp ) { return -1L; } /* Seek to the end of the file */ rc = fseek(fp, 0L, SEEK_END); if( 0 != rc ) { return -1L; } /* Byte offset to the end of the file (size) */ if( 0 > (off_end = ftell(fp)) ) { return -1L; } fsz = (size_t)off_end; /* Allocate a buffer to hold the whole file */ *buf = malloc( fsz+(int)add_nul ); if( NULL == *buf ) { return -1L; } /* Rewind file pointer to start of file */ rewind(fp); /* Slurp file into buffer */ if( fsz != fread(*buf, 1, fsz, fp) ) { free(*buf); return -1L; } /* Close the file */ if( EOF == fclose(fp) ) { free(*buf); return -1L; } if( add_nul ) { /* Make sure the buffer is NUL-terminated, just in case */ *buf[fsz] = ‘\0’; } /* Return the file size */ return (long)fsz; } /* * Demonstrates a call to ‘slurp’. */ int main(void) { long file_size; char *buf; file_size = slurp("./test_file.json", &buf, false); if( file_size < 0L ) { perror("File read failed"); return 1; } (void)fwrite(buf, 1, file_size, stdout); /* Remember to free() memory allocated by slurp() */ free( buf ); return 0; } [/bash]
 $ gcc -o read_file_to_buffer read_file_to_buffer.c 
 $ ./read_file_to_buffer 

Reference : https://stackoverflow.com/questions/3747086/reading-the-whole-text-file-into-a-char-array-in-c

Leave a Comment