我想打开用户在屏幕上键入的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
函数中NULL
为load_bmp()
时。
谁能告诉我导致问题的原因是什么?
答案 0 :(得分:1)
fgets
的手册页特别说
在EOF或换行符后停止阅读。如果读取换行符,则为 存储在缓冲区中。
如果您的name
变量以换行符结尾(如果您在输入名称时按ENTER键,则该变量),它不会与文件名匹配。您需要删除名称末尾的换行符。