使用fscanf读取含Unix路径与短横线的文件时的问题排查
问题分析与解决
一、循环无输出的原因及修复
你的代码存在两个核心问题:
- 未检查文件是否成功打开
调用fopen后没有判断返回值,如果test_read.txt不存在、路径错误或无读取权限,file_list会保持NULL,此时操作空指针调用fscanf会触发未定义行为,直接跳过循环。
修复代码:file_list = fopen("test_read.txt", "r"); if (file_list == NULL) { perror("打开文件失败"); return 1; // 或其他错误处理逻辑 } - 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
相关产品推荐
相关产品推荐

