如何用C语言将文本文件中内容读入程序,并按照第二列的数据进行从大到小排序。

如何用C语言将文本文件中内容读入程序,并按照第二列的数据进行从大到小排序(要保证排序后第一列和第二列的内容是一一对应的,像excel中的排序一样),并将排序好的内容输出到txt文件中。

文本内容:

SA200701 -3278538
SB330802 -2134641
SC640904 0
SD750505 -1192300
SE960906 12001
SF180607 14250
SG560008 0
SH450009 -575835
SI930010 -56200
我已经找到原因了,修改好,谢谢大神!!!
真是太强大了!真牛!!!

#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct stt
{
    char c1[9];
    int c2;
    struct stt *next;
}STT;
void readFile(FILE *fp);
void writeFile(FILE *fp);
void printfSTT();//打印链表
void px();//将链表按c2降序排列
STT *sttHead=NULL,*sttTail=NULL;
int main()
{
    FILE *fp;
    if((fp=fopen("c:\\list.txt","rt+"))==NULL)
    {
        printf("can't open File!");
        exit(1);
    }
    sttHead=(STT *)malloc(sizeof(STT));
    sttHead->next=NULL;
    readFile(fp);
    printfSTT();
    px();
    printf("-----------排序后-------------\n");
    printfSTT();
    writeFile(fp);
    return 0;
}
void px()
{
    STT *sttHeadSave1=sttHead,*sttHeadSave2=NULL,sttSave,*nextSave;
    while(sttHeadSave1->next!=NULL)
    {
        sttHeadSave2=sttHeadSave1->next;
        while(sttHeadSave2->next!=NULL)
        {
            if((sttHeadSave1->next->c2)<(sttHeadSave2->next->c2))
            {
                sttSave=*(sttHeadSave1->next);
                nextSave=sttHeadSave1->next->next;
                *(sttHeadSave1->next)=*(sttHeadSave2->next);
                sttHeadSave1->next->next=nextSave;
                nextSave=sttHeadSave2->next->next;
                *(sttHeadSave2->next)=sttSave;
                sttHeadSave2->next->next=nextSave;
            }
            sttHeadSave2=sttHeadSave2->next;
        }
        sttHeadSave1=sttHeadSave1->next;
    }
}
void printfSTT()
{
    STT *sttHeadSave=sttHead;
    printf("-----------打印链表-------------\n");
    while(sttHeadSave->next!=NULL)
    {
        printf("%s  %d\n",sttHeadSave->next->c1,sttHeadSave->next->c2);
        sttHeadSave=sttHeadSave->next;
    }
}
void readFile(FILE *fp)
{
    int c2;
    char c1[9];
    STT *sttNew;
    fseek(fp,0,SEEK_SET);
    printf("-----------读取文件到链表-------------\n");
    while(fscanf(fp,"%s %d",c1,&c2)!=-1)
    {
        sttNew=(STT *)malloc(sizeof(STT));
        sttNew->next=NULL;
        strcpy(sttNew->c1,c1);
        sttNew->c2=c2;
        if(sttHead->next==NULL)
            sttHead->next=sttNew;
        else
            sttTail->next=sttNew;
        sttTail=sttNew;
    }
}
void writeFile(FILE *fp)
{
    fseek(fp, 0, SEEK_SET);
    fseek(fp, 0, SEEK_END);
    printf("-----------开始写入文件-------------\n");
    STT *sttHeadSave=sttHead;
    fprintf(fp,"%s","-----------排序后-------------\n");
    while(sttHeadSave->next!=NULL)
    {
        fprintf(fp,"%s %d%s",sttHeadSave->next->c1,sttHeadSave->next->c2,"\n");
        sttHeadSave=sttHeadSave->next;
    }
    printf("------------写入完成-------------\n");
}

追问

膜拜大神!!!
确实可以,但是如果第二列里面有带小数的数据(比如:258342.235756的数据),我把代码里的int c2改成了float c2为什么就不行呢?
如果第二列里面是带小数的数据又该怎么改呢,麻烦大神再给修改下,真的非常感谢!!!

温馨提示:答案为网友推荐,仅供参考
相似回答