《C++ Primer》习题代码异常:根目录运行返回-1求助
问题分析与解决方案
核心问题
程序返回-1的直接原因是文件打开失败,根源在于代码大概率存在以下两类问题:
- 硬编码了输入/输出文件的相对路径或文件名,未按题目要求从命令行参数中获取指定文件名
- 未对命令行参数数量、文件打开结果做有效性检查
场景差异解释
- 在编译目录运行时,输入输出文件和程序处于同一目录,硬编码的相对路径能正确定位到文件,因此运行正常
- 复制到根目录后,根目录下不存在这些硬编码的文件,导致文件打开失败,程序返回-1
修正方案
通过命令行参数获取文件名
严格遵循题目要求,从argv中读取输入文件、奇数输出文件、偶数输出文件的路径,而非写死固定文件名。增加有效性检查逻辑
在打开文件前,先验证命令行参数数量是否正确,再逐一检查文件是否成功打开:
#include <iostream> #include <fstream> #include <iterator> using namespace std; int main(int argc, char *argv[]) { // 检查参数数量是否符合要求 if (argc != 4) { cerr << "用法: 程序名 输入文件名 奇数输出文件名 偶数输出文件名" << endl; return -1; } // 打开输入文件并验证 ifstream in(argv[1]); if (!in) { cerr << "无法打开输入文件: " << argv[1] << endl; return -1; } // 打开奇数输出文件并验证 ofstream out_odd(argv[2]); if (!out_odd) { cerr << "无法打开奇数输出文件: " << argv[2] << endl; return -1; } // 打开偶数输出文件并验证 ofstream out_even(argv[3]); if (!out_even) { cerr << "无法打开偶数输出文件: " << argv[3] << endl; return -1; } // 使用迭代器处理数据 istream_iterator<int> in_iter(in), eof; ostream_iterator<int> out_iter_odd(out_odd, " "); ostream_iterator<int> out_iter_even(out_even, "\n"); for (; in_iter != eof; ++in_iter) { if (*in_iter % 2 != 0) { *out_iter_odd++ = *in_iter; } else { *out_iter_even++ = *in_iter; } } return 0; }
- 正确运行方式
将程序复制到任意目录后,需在命令行中指定文件的完整路径(或确保文件与程序同目录),示例命令:
./program /path/to/input.txt /path/to/odd_output.txt /path/to/even_output.txt
内容的提问来源于stack exchange,提问作者gaofeng
相关产品推荐
相关产品推荐

