Here's my attempt at checking fread for the correct return values... which I might they weren't returning. However, still no correct values from binary to output.
Code:
// ProjectThreeSourceA.c
// This program searches a binary file for a given hex pattern. Files are
// found in the binary file via this pattern. The offsets of where the files
// were found are output to another file, to be named by user input. Along with
// the number of files found and their offsets, the output file will also contain
// their sizes.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define base UCHAR_MAX + 1
struct FileHeader {
unsigned long magic_number;
unsigned long fileLength;
} header;
void performFileIO(const char *infile)
{
FILE *FileIn, *FileOut;
char inBuffer[BUFSIZ];
unsigned char tempBuffer[4];
unsigned long result;
int position = 0, i;
// marks the header of a file found within the input file
const unsigned char pattern[] = {0xFF, 0x57, 0x50, 0x43};
// properly open the binary file for reading
FileIn = fopen(infile, "rb");
if (FileIn == NULL) {
printf("The file could not be opened, please check your file and location before trying again.\n");
exit(1);
}
printf("Enter the name and path for the output file: ");
gets(inBuffer);
FileOut = fopen(inBuffer, "w+b");
// position the file marker at the beginning of file
fseek(FileIn, 0, SEEK_SET);
while (!feof(FileIn))
{
position++;
if (fgetc(FileIn) == pattern[0]) {
tempBuffer[0] = pattern[0];
if (fread(tempBuffer + 1, sizeof(char), 3, FileIn) != 3) {
printf("Error reading file.\n");
exit(1);
}
if (memcmp(pattern, tempBuffer, sizeof(pattern)) == 0) {
printf("Match Found.\n");
// now that match is found compute and load pattern into struct
for (i = 0, result = 1; i < 4; i++) {
result = result * base + pattern[ i ];
}
header.magic_number = result;
fseek(FileIn, 16, SEEK_CUR); // find the file size
// four byte size of file found
if (fread(tempBuffer, sizeof(char), 4, FileIn) != 4) {
printf("Match found but fatal error reading file.\n");
exit(1);
}
// after finding filesize compute and load it into struct
for (i = 0, result = 1; i < 4; i++) {
result = result * base + tempBuffer[ i ];
}
header.fileLength = result;
// retract to the pattern header
fseek(FileIn, -20, SEEK_CUR);
// read the full - whole file loaded into the structure
if (fread(&header, sizeof(struct FileHeader), 1, FileIn) != 1) {
printf("Match found but fatal error reading of size struct.\n");
exit(1);
}
// present for output to user specified file
fwrite(&header, sizeof(struct FileHeader), 1, FileOut);
break;
continue;
}
fseek(FileIn, -3, SEEK_CUR);
}
}
// close the files and at the same time flush the buffers
fclose(FileIn);
fclose(FileOut);
}
// program entry point
int main(int argc, char *argv[])
{
char buffer[BUFSIZ];
printf("Please enter the name and path of the binary file: ");
gets(buffer);
performFileIO(buffer);
printf("\n Done!\n Press enter to exit\n");
getchar();
return 0;
}