69 lines
1.4 KiB
C
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
|