C语言fclose文件后重声明同名FILE指针报变量遮蔽错误求助
问题原因
报错declaration shadows a local variable是C语言的作用域规则导致的,和你有没有fclose文件没有关系。
你已经在main函数的外层作用域声明了FILE *outptr变量,在循环内部的代码又加了FILE *类型声明,相当于在内层作用域创建了一个完全同名的新变量,这个操作就叫「变量阴影(shadow)」,你的编译参数开启了-Werror -Wshadow,会把这种容易引发逻辑错误的写法直接判定为编译错误。
修复方法
直接删除循环内outptr赋值前的FILE *类型声明即可,复用外层已经声明的变量:
把代码行
FILE *outptr = fopen(outfile, "w");
修改为:
outptr = fopen(outfile, "w");
其他需要修复的代码问题
你的代码还有几处逻辑错误,会导致运行异常:
- sprintf输出文件名时多写了
\n换行符,会导致生成的文件名末尾带换行,无法正常创建文件,修改为sprintf(outfile, "%03d.jpg", i);即可 - buffer定义为
int16_t类型不符合需求,JPEG头是单字节匹配逻辑,建议修改为uint8_t buffer[512];,同时调整JPEG头判断的索引逻辑 - 未初始化的buffer直接做逻辑判断,存在未定义行为,建议把首次fread操作放到判断逻辑之前
- fread的参数建议调整为
fread(buffer, 1, BLOCK_SIZE, infile),通过返回值判断是否到达文件末尾,替换硬编码的循环次数限制
内容的提问来源于stack exchange,提问作者Son Phan
相关产品推荐
相关产品推荐

