You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:15:03