A simple file type detector

/*
 * ftype_detector.c
 *
 *  Created on: 23 May, 2014
 *      Author: user
 */


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>         // import bool type

bool ftype_matched(FILE* fp, unsigned char magic_num[], int magic_size) {
    int i = 0;
                                       
    fseek(fp, 0, SEEK_SET);// THIS RESETS THE FILE POINTER TO 0; man fseek FOR DETAILS
    
    for(i=0;i<magic_size;i++){
    if(magic_num[i]!=EOF){
    if(fgetc(fp)==magic_num[i]){
    continue;
            }
    else
    return false;    
        }
    }
    return true;
}

int main(int argc, char* argv[]) {
    if (argc != 2) {//arg count!=2 imply that input is not null
        fprintf(stderr,"Please specify the filename!\n");
        fprintf(stderr,"Usage: %s filename\n", argv[0]);
        return EXIT_FAILURE;
    }

    FILE* fp = fopen(argv[1],"r");//open file based on path and the string followed
   
    if (fp==NULL) {
        fprintf(stderr, "File %s does not exist\n",argv[1]);
        return EXIT_FAILURE;
    }

    unsigned char magic_zip[] = "PK\x03\x04";                   //magic numbers
    unsigned char magic_png[] = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a";
    unsigned char magic_jpg[] = "\xff\xd8";
    unsigned char magic_gif[] = "GIF89a";
    unsigned char magic_pdf[] = "%PDF";

    printf("File Type: ");
    if (ftype_matched(fp,magic_zip,4))
        printf("ZIP\n");
    else if (ftype_matched(fp,magic_png,8))
        printf("PNG\n");
    else if (ftype_matched(fp,magic_jpg,2))
        printf("JPG\n");
    else if (ftype_matched(fp,magic_gif,6))
        printf("GIF\n");
    else if (ftype_matched(fp,magic_pdf,4))
        printf("PDF\n");
    else
        printf("Unknown\n");

    /* TODO: WHAT IS THE FUNCTION TO CLOSE THE FILE STREAM*/
    fclose(fp);

    return EXIT_SUCCESS;
}

Input:./program name file path

Output:File type: GIF(for example)



你可能感兴趣的:(File,open,Argument)