原文链接:http://www.juzicode.com/cpp-error-vs2015-fopen-fscanf-warning-c4566
错误提示:
fopen()打开文件,fscanf()获取文件内容失败:
//vx:桔子code ; juzicode.com
#include "stdio.h"
int main(void)
{
char buff[255];
printf("开始从文件读取......");
FILE *fp = fopen("1.txt", "r");
fscanf(fp, "%s", buff);
printf("从文件读取内容为: %s\n", buff);
return 0;
}
错误原因:
1、生成后的可执行文件的相同目录下确实存在1.txt文件,但是读取时出错了,导致第9行没有执行到,增加打印内容:
fp为空指针所以程序退出,另外文件名称不是代码第7行的”1.txt”,而是多了个乱码的字符“?1.txt”。
检查编译信息,在第7行存在一条告警内容:
main.cpp(7): warning C4566: 由通用字符名称“\u202A”表示的字符不能在当前代码页(936)中表示出来
从运行结果和告警信息看,第7行的文件名称和实际在该目录下的文件名称并不匹配,多了个\u202A的unicode字符 ,该字符是一中特殊的控制字符,单从显示上是看不出来的,但是实际存在,所以fopen访问的是一个不存在的文件导致运行时出错。
解决方法:
1、删除第7行的文件名称和双引号,手动输入文件名称:
//vx:桔子code ; juzicode.com
#include "stdio.h"
int main(void)
{
char buff[255];
printf("开始从文件读取......");
//FILE *fp = fopen("1.txt", "r");
FILE *fp = fopen("1.txt","r");
printf("fp: %d\n", fp);
printf("文件名称:%s\n", "1.txt");
fscanf(fp, "%s", buff);
printf("从文件读取内容为: %s\n", buff);
return 0;
}
如果本文还没有完全解决你的疑惑,你也可以在微信公众号“桔子code”后台给我留言,欢迎一起探讨交流。