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

C++使用sentinel值与计数器控制读取文件数据输出异常求解

问题排查

  • 输入判断逻辑错误:fileSel被定义为char类型,用户输入1/2时实际存储的是字符'1'(ASCII码49)、'2'(ASCII码50),直接和整数1、2做相等判断永远不成立,导致两个读取文件的循环完全不会执行,numValues始终为0,是输出0个数值的核心原因
  • 变量初始化与计算时机错误:平均值avg在程序开头就计算,此时values是未初始化的垃圾值,numValues为0,除0操作得到-inf,未初始化的values就是输出的乱码数值来源;且你没有定义变量存储数值总和、也没有容器存储所有读取到的数值,每次读入都会覆盖上一次的values,无法输出所有数值、也无法计算正确平均值
  • 外层循环逻辑错误:用户只做一次选择,不需要用while包裹读取逻辑,否则满足条件会触发死循环
  • 计数器读取逻辑错误:循环条件numValues <= counter会尝试读取11次,超过你说的10个数值的预期;且没有判断文件读取是否成功
  • 哨兵读取逻辑错误:while (inFile >> values);后面直接跟分号,循环体为空,会直接读到文件结束才停止,计数逻辑也完全错误,且哨兵的判断、输出逻辑位置都不正确
  • 文件名拼写错误:counter_controlled.txt 后面多了一个空格,会导致文件打开失败

修正后代码

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main() {
    int fileSel;
    int numValues = 0;
    int value;
    double sum = 0;
    double avg;
    const int COUNTER = 10;
    const int SENTINEL_VALUE = -9999;
    vector<int> allValues;

    cout << "请选择要打开的文件类型:" << endl;
    cout << "1. 计数器控制" << endl;
    cout << "2. 哨兵控制" << endl;
    cin >> fileSel;

    if (fileSel == 1) {
        ifstream inFile("counter_controlled.txt");
        if (inFile.fail()) {
            cerr << "无法打开输入文件" << endl;
            return -1;
        }
        while (numValues < COUNTER && inFile >> value) {
            allValues.push_back(value);
            sum += value;
            numValues++;
        }
        inFile.close();
    } else if (fileSel == 2) {
        ifstream inFile("sentinel_controlled.txt");
        if (inFile.fail()) {
            cerr << "无法打开输入文件" << endl;
            return -1;
        }
        while (inFile >> value) {
            if (value == SENTINEL_VALUE) {
                break;
            }
            allValues.push_back(value);
            sum += value;
            numValues++;
        }
        inFile.close();
    } else {
        cerr << "输入选项无效" << endl;
        return -1;
    }

    avg = sum / numValues;
    cout << "文件中共有 " << numValues << " 个值" << endl;
    cout << "文件中的数值为:";
    for (int i = 0; i < allValues.size(); i++) {
        if (i > 0) cout << " ";
        cout << allValues[i];
    }
    cout << endl;
    cout << "平均值为:" << avg << endl;

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:18:04