C++读取外部文件整数值存入数组并输出的实现方法
问题原因与修复方案
代码核心问题
- 头文件缺失:代码使用了
cout/cerr、time()函数,但没有引入<iostream>和<ctime>头文件,会直接导致编译失败。 - eof()读取逻辑错误:所有读取文件的循环均使用
while(!infile.eof())写法,该写法会在文件末尾多读一次无效值,导致统计结果偏差、数组存入垃圾值。正确写法是直接将读取操作作为循环判断条件,读取成功才进入循环处理。 - 数组定义与使用错误:
- 你将
arraydisplay数组定义在while循环内部,每次循环都会重新创建数组,循环结束后数组直接销毁,无法保存读取到的数值 - 尝试用
{ infile >> arrayvalues }给数组初始化是错误的,>>运算符返回的是流对象本身,无法直接作为数组元素的初始值 - 最后输出
arraydisplay[50]属于数组越界访问,数组长度为50时下标合法范围是0~49,越界访问会触发未定义行为(崩溃/输出乱值)
- 你将
- 错误提示不匹配:打开的文件是
randomnumbers.txt,但报错信息写的是inputfile.txt,会误导问题排查。
修复后的完整代码
#include <fstream> #include <cstdlib> #include <iostream> #include <ctime> using namespace std; //function 1 创建存储随机数的文件 void createfile() { srand(time(0)); ofstream randNums("randomnumbers.txt"); for (int counter = 0; counter < 50; counter++) { int generatednum = rand() % 105 + 2; randNums << generatednum << endl; } randNums.close(); } //function 2 统计采摘苹果数低于25的人数 void countundertwentyfive() { int under25count; int under25amount = 0; ifstream infile; infile.open("randomnumbers.txt"); if (infile.fail()) { cerr << "文件打开失败:randomnumbers.txt"; abort(); } while (infile >> under25count) { if (under25count < 25) { under25amount++; } } cout << under25amount << " 人采摘的苹果数低于25个。" << endl; infile.close(); } //function 3 统计采摘苹果数在80到100之间的人数 void btwn80and100() { int eightyand100apples; int under80and100amount = 0; ifstream infile; infile.open("randomnumbers.txt"); if (infile.fail()) { cerr << "文件打开失败:randomnumbers.txt"; abort(); } while (infile >> eightyand100apples) { if (eightyand100apples >= 80 && eightyand100apples <= 100) { under80and100amount++; } } cout << under80and100amount << " 人采摘的苹果数在80到100个之间。" << endl; infile.close(); } //function 4 计算人均采摘苹果数 void averageapplepicked() { int numbergetter; int sum = 0; int count = 0; ifstream infile; infile.open("randomnumbers.txt"); if (infile.fail()) { cerr << "文件打开失败:randomnumbers.txt"; abort(); } while (infile >> numbergetter) { sum += numbergetter; count++; } int avg = sum / count; cout << "人均采摘苹果数约为 " << avg << " 个" << endl; infile.close(); } int main() { createfile(); countundertwentyfive(); btwn80and100(); averageapplepicked(); int arrayvalues; int arraydisplay[50]; int idx = 0; ifstream infile; infile.open("randomnumbers.txt"); if (infile.fail()) { cerr << "文件打开失败:randomnumbers.txt"; abort(); } while (infile >> arrayvalues && idx < 50) { arraydisplay[idx++] = arrayvalues; } // 逐个输出数组元素 cout << "文件中存储的所有数值如下:" << endl; for(int i = 0; i < idx; i++) { cout << arraydisplay[i] << " "; // 每10个换一行方便查看 if((i+1)%10 == 0) cout << endl; } infile.close(); return 0; }
内容的提问来源于stack exchange,提问作者tgol。
相关产品推荐
相关产品推荐

