C++在Xcode环境下txt文件打开失败及变量未初始化报错问题求助
问题1:文件打开报错原因
你代码开头已经用#define inFile定义了txt文件的绝对路径,但实际调用rss.open()时传入的是相对路径"studentScore8.txt"。Xcode运行C++程序时的默认工作目录不是你的代码存放目录,相对路径无法定位到你放在桌面的txt文件,自然会打开失败。
修复方案:把打开文件的代码改为rss.open(inFile); 或者手动在Xcode的Scheme设置里把运行工作目录修改为txt文件所在的文件夹。
另外文件打开失败后你没有终止程序,后续依然会执行读数据逻辑,读取到的全是异常值,建议在cout << "error in opening studentScore8.txt" << endl;后加return 1;直接退出程序。
问题2:变量未初始化警告原因
Xcode的提示是正确的,这两个变量确实未完成有效赋值:
average变量:你调用了mean(scores, count)计算平均值,但没有把函数返回值赋值给average,需要修改为average = mean(scores, count);oneScore变量:你在main函数里定义该变量后没有做任何赋值,直接就传入printGrade。而且main函数里的这行printGrade(oneScore, average);本身是多余的,你后续在printTable里遍历每个分数调用printGrade才是正确逻辑,这行多余代码直接删除即可。
问题3:表格填充异常值的原因
除了上述文件读取失败的问题外,还有三个逻辑错误:
- main函数里的
count变量定义时没有初始化为0,readStuData里直接执行++count会使用随机初始值,导致后续平均分计算、遍历逻辑全部出错,修改为int count = 0;即可。 printGrade函数逻辑错误:你在函数内额外定义了未关联文件的ifstream rss,还执行rss >> oneScore覆盖了传入的分数参数,读取空流会导致oneScore变成异常值。直接删除printGrade里的ifstream rss;和rss >> oneScore;两行代码即可。printTable里循环用的是MAX_SIZE而不是传进来的count,如果实际数据量小于MAX_SIZE,会输出多余的乱值行,建议把for(i = 0; i < MAX_SIZE; ++i)改成for(i = 0; i < count; ++i)。
额外可优化的问题
readStuData里的count > MAX_SIZE判断永远不会成立:你循环最多执行MAX_SIZE次,count最多累加MAX_SIZE次,这个判断逻辑无用可以删除。readStuData里的循环没有判断文件读取是否成功,若文件内数据行数不足MAX_SIZE,后续的id和scores数组元素会被填充乱值,建议循环条件增加读取成功的判断。
内容的提问来源于stack exchange,提问作者spacecowboy
相关产品推荐
相关产品推荐

