C++冒泡排序不生效、ifstream文件句柄无法复用问题求助
问题1:冒泡排序不生效的原因
- 数组未提前加载数据:当前代码调用
bubbleSort前没有执行过文件读取操作,playerArray里全是未初始化的垃圾值,排序没有实际意义。后续调用displayNumberAve时才重新从文件读取原始数据覆盖数组,自然输出的是未排序的原始顺序。 count变量未正确初始化:main函数中定义的count没有赋值,bubbleSort函数内部又重复定义了同名局部变量count,覆盖了传入的参数,两个count都是未定义的垃圾值,排序循环的边界完全错误,不会执行有效的排序逻辑。- 排序后重新读文件覆盖数组:就算前面排序正确,你在
displayNumberAve里又重新读取了一次原始文件,把已经排好序的数组内容直接覆盖,也会导致输出还是原始顺序。
问题2:ifstream无法复用的原因
openFile函数里打开文件后立即执行了inFile.close(),传回到main函数的流对象本身就是关闭状态,后续使用当然需要重新打开。- 就算不关闭文件,读完一次文件后流的文件指针会指向文件末尾,同时
eof错误位会被置位,要复用必须先调用inFile.clear()清空错误状态,再调用inFile.seekg(0, ios::beg)把指针移到文件开头才能重新读取内容。
修正后可运行代码参考
#include<iostream> #include<iomanip> #include<fstream> using namespace std; //函数声明 void openFile(ifstream &inFile); void loadData(ifstream &inFile, int &count, int playerArray[], double averageArray[]); void displayNumberAve(int count, int playerArray[], double averageArray[]); void bubbleSort(int playerArray[], int count); //全局常量 const int SIZE = 50; int main() { int playerArray[SIZE]; double averageArray[SIZE]; ifstream inFile; int count = 0; //初始化count openFile(inFile); loadData(inFile, count, playerArray, averageArray); inFile.close(); //数据加载完成后关闭文件即可 bubbleSort(playerArray, count); cout << "Sorted array below" << endl; displayNumberAve(count, playerArray, averageArray); return 0; } void openFile(ifstream &inFile) { inFile.open("battingInfo.txt"); if(!inFile) { cout << "File not found, dummy" << endl; exit(1); } //此处不要关闭文件,留给数据加载逻辑使用 } //单独抽离数据加载逻辑,避免和展示功能耦合 void loadData(ifstream &inFile, int &count, int playerArray[], double averageArray[]) { count = 0; //替换掉!eof()的写法,避免多读无效行 while(count < SIZE && inFile >> playerArray[count] >> averageArray[count]) { count++; } } //展示逻辑直接使用已经加载完成的数组,不需要重复操作文件 void displayNumberAve(int count, int playerArray[], double averageArray[]) { cout << "Player Batting Average" << endl; for(int i = 0; i < count; i++) { cout << setw(2) << left << playerArray[i] << right << setw(13) << averageArray[i] << endl; } } void bubbleSort(int playerArray[], int count) { //删除重复定义的局部count变量 int maxElement; int index; for (maxElement = count - 1; maxElement > 0; maxElement--) { for (index = 0; index < maxElement; index++) { if (playerArray[index] > playerArray[index + 1]) { swap(playerArray[index] , playerArray[index + 1]); } } } }
内容的提问来源于stack exchange,提问作者ShadyForever
相关产品推荐
相关产品推荐

