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
#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;
}
$ 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