1
0
Fork 0
Advent-of-Code/2015/utils/file.h

69 lines
1.4 KiB
C

#ifndef INC_2015_FILE_H
#define INC_2015_FILE_H
#include "stdio.h"
#include "stdlib.h"
#define MAX_READ_SIZE 4096
char* readFile(const char* filename) {
FILE* file;
errno_t openErr = fopen_s(&file, filename, "rb");
if (openErr != 0 || !file) {
printf("Error opening input file, code %d\n", openErr);
return NULL;
}
fseek(file, 0L, SEEK_END);
int fileSize = ftell(file);
rewind(file);
if (fileSize == 0) {
printf("Input file is empty\n");
fclose(file);
return NULL;
}
char* contents = malloc(fileSize + 1);
if (!contents) {
printf("Error allocating %d bytes for storing input file\n", fileSize + 1);
fclose(file);
return NULL;
}
size_t position = 0;
while (position < fileSize) {
size_t remainingSpace = fileSize - position;
size_t readBytes = fread_s(contents + position, remainingSpace, 1, min(remainingSpace, MAX_READ_SIZE), file);
position += readBytes;
int readErr = ferror(file);
if (readErr) {
perror("Error reading input file");
fclose(file);
free(contents);
return NULL;
}
if (readBytes == 0) {
printf("Error reading input file, read 0 bytes\n");
fclose(file);
free(contents);
return NULL;
}
}
fclose(file);
if (position != fileSize) {
printf("Error reading whole file, read only %zu bytes out of %d\n", position, fileSize);
free(contents);
return NULL;
}
contents[fileSize] = 0;
return contents;
}
#endif //INC_2015_FILE_H