C++程序读取整数后输出垃圾值,寻求技术帮助
兄弟,我太懂这种盯着屏幕看垃圾值的崩溃感了!咱们一步步拆解问题,把这个程序给救回来~
先揪最可能的元凶:文件读取失败
如果程序没成功打开文件,或者没读够19个数字,数组里就全是内存里的随机乱码,输出自然是垃圾值。这一步一定要做检查:
- 打开文件后立刻判断状态,别硬读:
ifstream inFile("你的文件名.txt"); if (!inFile) { cout << "完蛋!文件打不开啊!" << endl; exit(EXIT_FAILURE); // 直接退,别继续瞎跑 }
- 还要确认你的文件里真的有19个整数,没有乱码、异常换行这类干扰读取的内容。
确保数组被正确填满
就算文件打开了,要是没读够19个数字,剩下的数组位置还是初始的垃圾值。所以读取的时候要循环到位,还要判断每个数字是否读成功:
int nums[19] = {0}; // 先把数组初始化成0,避免一开始就是乱码 for (int i = 0; i < 19; ++i) { if (!(inFile >> nums[i])) { cout << "第" << i+1 << "个数字读失败了!文件里数字不够?" << endl; exit(EXIT_FAILURE); } }
排序找目标值才是正确姿势
要找第2小和第5大,最稳妥的方法是先把数组排好序,别自己瞎找(很容易搞混索引)。记得加<algorithm>头文件用标准库的sort:
- 默认是从小到大排序,排序后:
- 第2小的数是
nums[1](索引从0开始,第1小是nums[0],第2小就是索引1) - 第5大的数是倒数第5个,也就是
nums[19-5] = nums[14]
- 第2小的数是
给你整好的完整代码
#include <iostream> #include <fstream> #include <cstdlib> #include <algorithm> // 用sort必须加这个头文件! using std::ifstream; using std::cout; using std::endl; int main() { const int NUM_COUNT = 19; int nums[NUM_COUNT] = {0}; // 初始化数组,避免初始垃圾值 ifstream inFile("numbers.txt"); // 换成你自己的文件名,路径不对的话要写绝对路径 // 检查文件是否打开成功 if (!inFile) { cout << "错误:文件打不开!检查路径和文件名对不对。" << endl; return EXIT_FAILURE; } // 读取19个整数,逐个检查是否成功 for (int i = 0; i < NUM_COUNT; ++i) { if (!(inFile >> nums[i])) { cout << "错误:第" << i+1 << "个数字读不出来!文件里可能没够19个数字。" << endl; inFile.close(); return EXIT_FAILURE; } } inFile.close(); // 从小到大排序 std::sort(nums, nums + NUM_COUNT); // 输出结果 cout << "第2小的整数:" << nums[1] << endl; cout << "第5大的整数:" << nums[NUM_COUNT - 5] << endl; // 19-5=14,对应索引14 return 0; }
额外提个醒
- 如果文件不在程序运行的当前目录,要写绝对路径,比如Windows的
"C:/test/numbers.txt",Linux的"/home/xxx/numbers.txt" - 要是想从大到小排序,就改成
std::sort(nums, nums + NUM_COUNT, std::greater<int>());,这时候第5大的数就是nums[4](索引从0开始,第1大是nums[0],第5大是索引4)
内容的提问来源于stack exchange,提问作者VivMike
相关产品推荐
相关产品推荐

