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

《C++ Primer》习题代码异常:根目录运行返回-1求助

问题分析与解决方案

核心问题

程序返回-1的直接原因是文件打开失败,根源在于代码大概率存在以下两类问题:

  • 硬编码了输入/输出文件的相对路径或文件名,未按题目要求从命令行参数中获取指定文件名
  • 未对命令行参数数量、文件打开结果做有效性检查

场景差异解释

  • 在编译目录运行时,输入输出文件和程序处于同一目录,硬编码的相对路径能正确定位到文件,因此运行正常
  • 复制到根目录后,根目录下不存在这些硬编码的文件,导致文件打开失败,程序返回-1

修正方案

  1. 通过命令行参数获取文件名
    严格遵循题目要求,从argv中读取输入文件、奇数输出文件、偶数输出文件的路径,而非写死固定文件名。

  2. 增加有效性检查逻辑
    在打开文件前,先验证命令行参数数量是否正确,再逐一检查文件是否成功打开:

#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;
}
  1. 正确运行方式
    将程序复制到任意目录后,需在命令行中指定文件的完整路径(或确保文件与程序同目录),示例命令:
./program /path/to/input.txt /path/to/odd_output.txt /path/to/even_output.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:05:12