V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zyqf
V2EX  ›  C

fopen(字符数组变量,"rb"),scanf 可以实现但是 fgets 不可以

  •  
  •   zyqf · 2016-10-29 15:59:33 +08:00 · 1641 次点击
    这是一个创建于 2979 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在写找迷宫路径的算法,遇到一个小小问题,百度不到, Google (也许英文太烂)不到,特意来问下。

    要打开一个用户指定的迷宫文件

    用 scanf 获取输入并存入 filepath[30]中,再用 fopen(filepath,"rb")打开文件,可正常打开。

    但是用 fgets 获取的话,则打开文件失败!

    我测试过了, filepath 中的内容是正确的。

    不知道是什么原因。希望大家能帮忙解惑下,谢谢~

    int load_map(char map[N][N] ,pos_seat &start, pos_seat &end){
    	//载入地图文件
    	char ch;
    	char filepath[30];
    	int x = 0;
    	int y = 0;
    	FILE *fp;
    
    	fgets(filepath,sizeof(filepath),stdin);  //这种获取用户输入,打开文件失败!
    	//scanf("%s",filepath);//这种则可以成功
    	if((fp = fopen(filepath,"rb"))==NULL){
    		printf("文件打开失败!\n");
    		exit(0);
    	}
        //.略过部分代码......
    	return 0;
    }
    
    5 条回复    2016-10-30 20:09:53 +08:00
    zk8802
        1
    zk8802  
       2016-10-29 16:16:21 +08:00
    你输入的路径是什么?长度是多少?
    SuperFashi
        2
    SuperFashi  
       2016-10-29 16:25:30 +08:00   ❤️ 1
    因为 fgets 读到的字符串带回车,所以不行。若你想用 fgets 的话,你需要 `filepath[strcspn(filepath, "\n")] = '\0';`
    zyqf
        3
    zyqf  
    OP
       2016-10-30 00:04:39 +08:00 via Android
    @SuperFashi 果然,感谢!
    ryd994
        4
    ryd994  
       2016-10-30 02:03:01 +08:00 via Android
    @SuperFashi 其实判断一下最后一个字符是不是\n 就好了啊
    用 strcspn 扫全长啊
    SuperFashi
        5
    SuperFashi  
       2016-10-30 20:09:53 +08:00
    @ryd994 然后就有一个问题,如何知道最后一个字符的位置? fgets 返回的可和 fread 不一样,你只能用 strlen ,所以还是全长的时间。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5590 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:51 · PVG 14:51 · LAX 22:51 · JFK 01:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.