在C语言system()中使用diff命令对比文件遇重定向问题求助
C语言system()调用diff命令的问题解决
错误原因分析
1. "missing operand after '/usr/bin/diff'"错误
这个报错是因为shell解析命令时,diff未获取到足够的文件参数,常见诱因:
- 命令字符串拼接时,diff与文件名之间缺少空格,被解析成一个无效整体
- 文件名包含空格/特殊字符却未用引号包裹,被shell拆分成多个无效参数
- C字符串中未正确转义引号,导致命令被提前截断
2. 生成空文件的问题
空文件通常有两种可能:
- 两个目标JSON文件完全一致,diff默认仅在文件有差异时输出内容,无差异则无输出
- 文件路径错误(相对路径下程序运行目录与文件所在目录不一致),diff执行失败但错误信息输出到stderr,而重定向仅捕获stdout,导致文件为空
正确实现代码
#include <stdlib.h> #include <stdio.h> #include <sys/wait.h> int main() { // 方案1:使用相对路径(确保程序运行时当前目录包含目标文件) const char* cmd = "/usr/bin/diff \"old_ap.json\" \"ap_afterTtime.json\" | tr '\\n' ';' > diffoutput"; // 方案2:使用绝对路径(替换为你的实际文件路径) // const char* cmd = "/usr/bin/diff \"/home/your_username/old_ap.json\" \"/home/your_username/ap_afterTtime.json\" | tr '\\n' ';' > diffoutput"; int ret = system(cmd); if (ret == -1) { perror("system调用失败"); } else { // 解析命令退出状态:0=文件无差异,1=文件有差异,>1=命令执行错误 printf("命令退出状态:%d\n", WEXITSTATUS(ret)); } return 0; }
关键排查步骤
- 手动验证命令:先在终端直接执行命令,确认是否有输出,排除文件本身无差异的情况
/usr/bin/diff old_ap.json ap_afterTtime.json | tr '\n' ';' > diffoutput - 捕获错误信息:如果文件为空但确认文件有差异,修改命令将stderr重定向到文件,查看diff的报错
const char* cmd = "/usr/bin/diff \"old_ap.json\" \"ap_afterTtime.json\" 2>&1 | tr '\\n' ';' > diffoutput"; - 检查路径一致性:用绝对路径指定文件,避免程序运行目录与文件所在目录不匹配的问题
内容的提问来源于stack exchange,提问作者Yusuf Siddiqui
相关产品推荐
相关产品推荐

