C++ FStream I/O/动态分配的数组触发断点

C++ FStream I/O/动态分配的数组触发断点,c++,fstream,C++,Fstream,基本上,此函数的作用是获取一组学生数据,并根据学生ID号对其进行排序,然后将其打印到新文件中。断点似乎出现在写入输出文件的循环中,但我不确定,因为似乎我在写入输出文件后所做的所有cout语句都被读取到控制台 void file_score(char* infile, char* outfile) { int size; ifstream fin(infile); fin >> size; int *student_id = new int

基本上,此函数的作用是获取一组学生数据,并根据学生ID号对其进行排序,然后将其打印到新文件中。断点似乎出现在写入输出文件的循环中,但我不确定,因为似乎我在写入输出文件后所做的所有cout语句都被读取到控制台

void file_score(char* infile, char* outfile)
{
    int size;

    ifstream fin(infile);

    fin >> size;
    
    int *student_id = new int(size);
    char *grade = new char(size);
    double *gpa = new double(size);
    //Creates new arrays of size that is read from file.

    for (int i = 0; i < size; i++)
    {
        fin >> student_id[i] >> grade[i] >> gpa[i];
        int temp_id = student_id[i];
        char temp_grade = grade[i];
        double temp_gpa = gpa[i];


        int j;
        for (j = (i - 1); j >= 0; j--)
        {
            if (student_id[j] < temp_id) {
                break;
            }
            student_id[j + 1] = student_id[j];
            grade[j + 1] = grade[j];
            gpa[j + 1] = gpa[j];
        }

        student_id[j + 1] = temp_id;
        grade[j + 1] = temp_grade;
        gpa[j + 1] = temp_gpa;
        //Using insertion sort to sort data as its being scanned in.    
    }

    fin.close();

    ofstream fout(outfile);
    for (int k = 0; k < size; k++)
    {
        fout << student_id[k] << " " << grade[k] << " " << gpa[k] << "\n";
    }
    //Print to file

    fout.close();
    delete []student_id;
    delete []grade;
    delete []gpa;
}
void file_分数(char*infile,char*outfile)
{
整数大小;
ifstream-fin(infle);
鳍>>大小;
int*student_id=新int(大小);
字符*等级=新字符(大小);
双精度*gpa=新双精度(尺寸);
//创建从文件读取的大小为的新数组。
对于(int i=0;i>学生id[i]>>成绩[i]>>平均成绩[i];
int temp_id=学生id[i];
字符温度等级=等级[i];
双温gpa=gpa[i];
int j;
对于(j=(i-1);j>=0;j--)
{
如果(学生id[j]<临时id){
打破
}
学生id[j+1]=学生id[j];
等级[j+1]=等级[j];
平均绩点[j+1]=平均绩点[j];
}
学生id[j+1]=临时id;
等级[j+1]=温度等级;
平均绩点[j+1]=临时平均绩点;
//使用插入排序在扫描数据时对其进行排序。
}
fin.close();
流孔(外流孔);
对于(int k=0;k因为这些说法是错误的:

int*student\u id=新int(大小);
字符*等级=新字符(大小);
双精度*gpa=新双精度(尺寸);
您没有分配3个数组,实际上是分配了3个单个值。因此,当您的循环尝试在以后访问数组元素时,它们错误地访问了内存,导致未定义的行为可能会损坏内存

将这些语句改为:

int*student_id=newint[size];
字符*等级=新字符[大小];
double*gpa=新的double[尺寸];
更好的解决方案是直接使用
std::vector
而不是
new[]
,不过:

std::vector学生id(大小);
标准:病媒等级(大小);
标准:向量gpa(大小);