C语言中无法通过用户输入打开二进制文件signatures的问题排查
问题根源与解决办法
嘿,这个问题我之前也碰到过!核心原因其实是fgets()的一个容易被忽略的行为:当你输入signatures然后按下回车时,fgets()会把**输入的字符串加上末尾的换行符\n**一起存到buffer里。也就是说,你传给fopen的其实是"signatures\n",而不是你以为的纯文件名——系统当然找不到一个带换行符的文件啦!
而直接写fopen("signatures","rb")时,字符串里没有多余的换行符,所以能正常匹配到你的文件。
给你两种靠谱的解决方式:
方法一:手动移除换行符(推荐,兼容带空格的文件名)
在调用fopen前,检查缓冲区末尾是否有换行符,有的话就替换成字符串结束符\0:
char buffer[1024]; fgets(buffer, 1024, stdin); // 处理换行符 size_t str_len = strlen(buffer); if (str_len > 0 && buffer[str_len - 1] == '\n') { buffer[str_len - 1] = '\0'; } FILE* file = fopen(buffer, "rb"); if(file){ printf("worked"); fclose(file); }
方法二:用scanf替代fgets(适合无空格的文件名)
如果你的文件名里不会有空格,用scanf("%s", buffer)更简单——它会自动跳过回车这类空白字符,直接读取到纯文件名:
char buffer[1024]; scanf("%s", buffer); // 自动跳过换行符,读取到不含换行的文件名 FILE* file = fopen(buffer, "rb"); if(file){ printf("worked"); fclose(file); }
不过要注意,scanf不会限制输入长度,如果输入的文件名超过buffer的大小会导致缓冲区溢出,所以如果文件名可能很长,还是方法一更安全。
另外提一句:你用的是Ubuntu环境,文件名是区分大小写的,但你直接写字符串能打开,所以排除大小写问题,就是换行符在搞鬼~
内容的提问来源于stack exchange,提问作者giorgioh
相关产品推荐
相关产品推荐

