c-为什么我必须在cs50恢复中检查文件为空



在代码末尾,为什么在写之前我必须检查img是否为null?为什么我们不能像在第二个代码段中那样写它?为什么我们必须检查它?

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;
}

我不能像下面的代码中那样直接写吗,因为如果满足if条件,img指针将不会为空

    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++;
}

那么为什么我们必须单独检查它是否为空

fopen(filename, "w")可以返回NULL,例如,如果您没有创建文件的权限。因此,您需要检查文件指针是否不是NULL。它是否嵌套在另一个if中并不重要。

此外,您应该在处理完fclose(img);之后调用它来关闭文件,这样可以释放资源,还可以确保内容完全刷新到文件中。您显示的第一个代码片段只关闭了创建的最后一个文件,因为它在while循环之外。

相关内容

  • 没有找到相关文章

最新更新