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
相关产品推荐
相关产品推荐

