You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fscanf读取含Unix路径与短横线的文件时的问题排查

问题分析与解决

一、循环无输出的原因及修复

你的代码存在两个核心问题:

  1. 未检查文件是否成功打开
    调用fopen后没有判断返回值,如果test_read.txt不存在、路径错误或无读取权限,file_list会保持NULL,此时操作空指针调用fscanf会触发未定义行为,直接跳过循环。
    修复代码:
    file_list = fopen("test_read.txt", "r");
    if (file_list == NULL) {
        perror("打开文件失败");
        return 1; // 或其他错误处理逻辑
    }
    
  2. fscanf返回值判断逻辑错误
    fscanf返回的是成功匹配并赋值的变量个数,你用!=EOF判断,若某次读取格式不匹配,返回值会小于5但不等于EOF,导致循环陷入无效执行。正确判断应为返回值等于期望读取的变量数(这里是5):
    while(fscanf(file_list, "%s %s %s %s %s", nouse,nouse,filename,nouse, str_char) == 5) {
        std::cout << "file name is " << filename << ", memory name is " << str_char << std::endl;
    }
    

二、关于fscanf读取含/和.的路径的问题

完全可以。fscanf的%s格式符会读取连续的非空白字符,/和.都不属于空格、换行这类空白字符,只要路径字符串中间没有空格,就能完整存入对应的char数组,你的示例场景完全满足这个条件。

另外,代码混用了C文件操作和C的cout,如果是C项目,更推荐用std::ifstream这类C++文件流,代码会更安全易维护。


内容的提问来源于stack exchange,提问作者candy283

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:45:10