在C上加载BMP文件时出错

时间:2016-01-02 03:58:35

标签: c vga

我想打开用户在屏幕上键入的bmp文件。我有一个要求图像名称的功能和另一个加载bmp图像的功能:

    /**************************************************************************
     *  load image                                                             *
     *    Ask the user for an image file to load into screen.                  *
     **************************************************************************/

    void load_image(){
        char name[100];
        BITMAP image;
        save_frame_buffer();
        set_mode(TEXT_MODE);
        printf("Enter the name of image (BMP): \n");
        fgets(name,100,stdin);
        set_mode(VGA_256_COLOR_MODE);        
        set_pallete(background.pallete);
        load_bmp(name,&image);
        show_buffer(frame_buffer);
        draw_bitmap(&image,32,0);

    }


/**************************************************************************
 *  load_bmp                                                              *
 *    Loads a bitmap file into memory.                                    *
 **************************************************************************/
void load_bmp(char *file, BITMAP *b){

    FILE *fp;
    long index;
    word num_colors;
    int x;

    /*Trying to open the file*/
    if((fp = fopen(file,"rb")) == NULL){

        printf("Error opening the file %s.\n",file);
        exit(1);
    }

    /*Valid bitmap*/
    if(fgetc(fp) != 'B' || fgetc(fp) != 'M'){

        fclose(fp);
        printf("%s is not a bitmap file. \n", file);
        exit(1);

    }


    /* Read and skip header
    */
    fskip(fp,16);
    fread(&b->width, sizeof(word),1 , fp);
    fskip(fp,2);
    fread(&b->height, sizeof(word),1,fp);
    fskip(fp,22);
    fread(&num_colors,sizeof(word),1,fp);
    fskip(fp,6);

    /* color number VGA -256 */
    if(num_colors ==0) num_colors = 256;


    /*Allocating memory*/
    if((b->data = (byte *) malloc((word)(b->width*b->height))) == NULL)
    {
        fclose(fp);
        printf("Error allocating memory for file %s.\n",file);
        exit(1);

    }

    /*Reading pallete information*/
    for(index=0;index<num_colors;index++){


        b->pallete[(int)(index*3+2)] = fgetc(fp) >> 2;
        b->pallete[(int)(index*3+1)] = fgetc(fp) >> 2;
        b->pallete[(int)(index*3+0)] = fgetc(fp) >> 2;
        x = fgetc(fp);

    }

    /*Reading the bitmap*/
    for(index=(b->height-1)*b->width;index>=0;index-=b->width){
        for(x=0;x<b->width;x++){
            b->data[(word)(index+x)] = (byte) fgetc(fp);

        }


    }
    fclose(fp);

}

load_bmp()功能正常,因为我已成功加载其他图像。我面临的问题是输入。

当我像这样对文件名进行硬编码时:

    load_bmp("mainbar.bmp",&image);

成功加载bmp文件。但是,当我将name变量放在fp函数中NULLload_bmp()时。

谁能告诉我导致问题的原因是什么?

1 个答案:

答案 0 :(得分:1)

fgets的手册页特别说

  

在EOF或换行符后停止阅读。如果读取换行符,则为   存储在缓冲区中。

如果您的name变量以换行符结尾(如果您在输入名称时按ENTER键,则该变量),它不会与文件名匹配。您需要删除名称末尾的换行符。