Arch Linux下本地C文件读写适配竞赛编程需求
解决Arch Linux下C语言竞赛代码本地文件IO乱码问题
问题根源
你遇到的乱码核心原因是文件名冲突:编译命令gcc addition.c -Wall -o output生成的可执行文件名为output,而代码中freopen("output", "w", stdout)又要往同名文件写入输出内容,运行时会直接覆盖可执行文件,导致文件损坏,出现乱码。此外还可能存在LOCAL宏未正确启用、输入文件格式错误的问题。
解决方案
1. 避免文件名冲突
修改编译命令的输出可执行文件名,或者调整代码中的输出文件名,确保两者不重复:
- 调整编译命令,生成不同名的可执行文件:
gcc addition.c -Wall -DLOCAL -o addition - 或者修改代码中的输出文件名,比如改成
"result.out":#ifdef LOCAL freopen("input", "r", stdin); freopen("result.out", "w", stdout); #endif
2. 确保LOCAL宏正确启用
编译时必须添加-DLOCAL参数,否则#ifdef LOCAL包裹的代码会被跳过,程序依然使用标准输入输出,不会读取本地文件。上面的编译命令已经包含了该参数。
3. 校验输入文件格式
确保input文件内容符合程序要求:文件中需包含两个用空格/换行分隔的整数,例如:
3 5
如果输入格式错误,scanf无法正确读取数据,会导致输出随机值,看起来像乱码。
验证方法
- 按上述修改后,编译生成可执行文件;
- 运行
./addition(对应编译命令生成的可执行文件名); - 查看输出文件(如
result.out),应该得到正确的两数之和。
这样修改后,代码在本地可以正常读取文件输入、写入输出,同时因为LOCAL宏仅在本地编译时定义,提交到Codeforces、CodeChef等平台时,平台不会定义该宏,代码会自动使用标准IO,完全不影响在线评测。
内容的提问来源于stack exchange,提问作者garakchy
相关产品推荐
相关产品推荐

