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, "i.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, "i.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
CodePudding user response:
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.