对原文件input.txt进行外排序,排序标准是首先按照股票代码的字典序进行排序,如果股票代码相同则按照日期从小到大进行排序

怎么处理文件,让文件能够一行一行之间比较,求详细一点的解释,求给出完整的代码,c++

将文件内容先读取出来,然后再根据规则进行遍历排序。

需要知道你的文件格式才能读文件啊,至少说明包含哪些字段。写了一个示例代码,文件格式、运行结果、代码如下:

文件格式:
股票代码 上市日期 上证指数
三个字段之间使用空格间隔开。
示例数据:


bs10001 2022-02-23 33.2
bs10002 2022-02-22 44.4
bs10003 2000-03-30 33.1
bs10004 2022-01-02 44.2
bs10002 2022-01-02 33.3

运行结果:

img

代码:

#include <iostream>
#include <fstream>
using namespace std;

typedef struct datainfo
{
    char code[20]; //股票代码
    char date[20]; //日期
    double rate; //指数
    //...如有其它字段,酌情添加
}DataInfo;

//读文件
void readFile(const char* filename, DataInfo data[], int& n)
{
    ifstream is;
    is.open(filename, ios::in);
    if (!is.is_open())
    {
        cout << "文件打开失败!" << endl;
        return;
    }
    n = 0;
    //逐行读取文件
    while (!is.eof())
    {
        data[n].code[0] = 0;
        is >> data[n].code >> data[n].date >> data[n].rate;
        if (strlen(data[n].code) > 0) //判断读取是否成功
            n++;
    }
    is.close();
}

//排序
void sort(DataInfo data[], int n)
{
    DataInfo tmp;
    int i, j;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (strcmp(data[j].code, data[j + 1].code) > 0)
            {
                tmp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = tmp;
            }
            else if (strcmp(data[j].code, data[j + 1].code) == 0) //股票代码相同,根据日期从小到大排序
            {
                if (strcmp(data[j].date, data[j + 1].date) > 0)
                {
                    tmp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = tmp;
                }
            }
        }
    }
}

//输出
void show(DataInfo data[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << "code:" << data[i].code << ",date:" << data[i].date << ",rate:" << data[i].rate << endl;
    }
}
int main()
{
    const char* filename = "data.txt";
    DataInfo data[1000];
    int nmb = 0;
    readFile(filename, data, nmb);
    cout << "原文件数据:" << endl;
    show(data, nmb);
    sort(data, nmb);
    cout << "排序后:" << endl;
    show(data, nmb);
    return 0;
}