ccs50file-handlingrecoverydata-recovery

why do i have to check the file to be null in cs50 recover


At the end of the code why do i have to check if img is not null before writing why can we not write it like in the second snippet? why do we have to check it?

FILE *input_file = fopen(argv[1], "r");
//if check Input_file pointer fail to open then REturn error code "Could not open file"
if (input_file == NULL)
{
    printf("Could not open file");
    return 2;
}

//declare a variable to unsigned char to store 512 chunks array
unsigned char buffer[512];

//for the purpose of counting of image later in the loop
int count_image = 0;

//An uninitialize file pointer to use to output data gotten from input file
FILE *output_file = NULL;

char *filename = malloc(8 * sizeof(char));
//char filename[8];

/*Read 512 bytes from input_file and store on the buffer*/
while (fread(buffer, sizeof(char), 512, input_file))
{
    //check if bytes is start of a JPEG
    if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
    {
        //write jpeg into file name in form 001.jpg, 002.jpg and so on
        sprintf(filename, "%03i.jpg", count_image);

        //open Out_file for writing
        output_file = fopen(filename, "w");

        //fwrite(buffer, sizeof(buffer), 1, output_file);
        //count number of image found
        count_image++;
    }
    //Check if output have been used for valid input
    if (output_file != NULL)
    {
        fwrite(buffer, sizeof(char), 512, output_file);
    }

}
free(filename);
fclose(output_file);
fclose(input_file);

return 0;
}

cant i write directly like in the code below as the the img pointer will not be null if the if condition is met

    if(buffer[0]==0xff && buffer[1]==0xd8 && buffer[2]==0xff && (buffer[3] & 0xf0) == 0xe0)
{

    sprintf(filename, "%03i.jpg", counter);
    img = fopen(filename, "w");
    fwrite(buffer,sizeof(uint8_t),512,img);
    counter++;
}

so why do we have to check seperately if it is null or not


Solution

  • fopen(filename, "w") can return NULL, if for example you don't have permission to create the file. So you need to check that the file pointer isn't NULL anyway. It doesn't matter whether it's nested inside the other if or not.

    Also, you should call fclose(img); after you're done with it to close the file, which frees up resources and also makes sure the contents are fully flushed to the file. The first code snippet you've shown only closes the last file created since it's outside the while loop.