C语言中FILE的索引顺序访问方法

时间:2017-04-22 09:33:13

标签: c file sorting

我需要使用索引顺序访问方法在C中组织文件的元素,但是在使用If()条件时遇到一些问题,当FILE的新元素是" first" ,在"中间"或者最后一个"我的文件之一,元素首先按类别组织,然后按品牌组织,然后按名称组织。

我理解这个问题,我知道它在哪里,但我不知道怎么写if语句。以下代码中的if条件标有" /// - >这是错误< - "

操作系统是Win 10,而我使用的IDE是Codeblocks

/** INPUT: FILE pointer, pprod is the new element to be organized in the file, PTO receives the number of the first element in the organized file   **/
/** PROCESS: Organize a FILE by the category, then by the brand(marque), then by the name of the product                                            **/
/** OUTPUT: /                                                                                                                                       **/

void fSequentielleLogique(FILE *Fproduit, struct fSequentielleFiche *pprod, int *PTO)   ///The fonction is called after the element is written into the file
{
    struct fSequentielleFiche TmpPrec, Tmp;
    ///The last element of the FILE receives -1
    pprod -> Offset = -1;
    ///When the FILE is just created PTO = -1
    if(*PTO == -1)
    {
        ///PTO receives the number (0) of the first element in the FILE
        *PTO = pprod -> Adresse;
        rewind(Fproduit);
        fwrite(pprod, sizeof(struct fSequentielleFiche), 1, Fproduit);
    }
    else
    {
        fseek(Fproduit, *PTO * sizeof(struct fSequentielleFiche), SEEK_SET);
        fread(&TmpPrec, sizeof(struct fSequentielleFiche), 1, Fproduit);
        TmpPrec.Offset = -1;

        fseek(Fproduit, *PTO * sizeof(struct fSequentielleFiche), SEEK_SET);
        fread(&Tmp, sizeof(struct fSequentielleFiche), 1, Fproduit);

        ///The elements are organized by the category
        while(Tmp.Offset != -1 && strcmp(pprod -> valeur.categorie, Tmp.valeur.categorie) > 0)
        {
            fseek(Fproduit, Tmp.Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
            fread(&TmpPrec, sizeof(struct fSequentielleFiche), 1, Fproduit);

            fseek(Fproduit, Tmp.Offset * sizeof(struct fSequentielleFiche), SEEK_SET);
            fread(&Tmp, sizeof(struct fSequentielleFiche), 1, Fproduit);
        }
        if(strcmp(pprod -> valeur.categorie, Tmp.valeur.categorie) == 0)
        {
            ///Then they are organized by the brand(marque)
            while(Tmp.Offset != -1 && (strcmp(pprod -> valeur.categorie, Tmp.valeur.categorie) == 0) && (strcmp(pprod -> valeur.marque, Tmp.valeur.marque) > 0))
            {
                fseek(Fproduit, Tmp.Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
                fread(&TmpPrec, sizeof(struct fSequentielleFiche), 1, Fproduit);

                fseek(Fproduit, Tmp.Offset * sizeof(struct fSequentielleFiche), SEEK_SET);
                fread(&Tmp, sizeof(struct fSequentielleFiche), 1, Fproduit);
            }
            if((strcmp(pprod -> valeur.categorie, Tmp.valeur.categorie) == 0) && (strcmp(pprod -> valeur.marque, Tmp.valeur.marque) == 0))
            {
                ///Then they are organized by the name
                while(Tmp.Offset != -1 && (strcmp(pprod -> valeur.categorie, Tmp.valeur.categorie) == 0) && (strcmp(pprod -> valeur.marque, Tmp.valeur.marque) == 0) && (strcmp(pprod -> valeur.nomProduit, Tmp.valeur.nomProduit) > 0))
                {
                    fseek(Fproduit, Tmp.Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
                    fread(&TmpPrec, sizeof(struct fSequentielleFiche), 1, Fproduit);

                    fseek(Fproduit, Tmp.Offset * sizeof(struct fSequentielleFiche), SEEK_SET);
                    fread(&Tmp, sizeof(struct fSequentielleFiche), 1, Fproduit);
                }
            }
        }
        if((strcmp(pprod -> valeur.categorie, Tmp.valeur.categorie) < 0) || (strcmp(pprod -> valeur.marque, Tmp.valeur.marque) < 0) || strcmp(pprod -> valeur.nomProduit, Tmp.valeur.nomProduit) < 0 || Tmp.Offset != -1) ///->Here is the error<-
        {
            //If I don't enter any loop I know that the element is the first of my FILE
            if(TmpPrec.Offset == -1)
            {
                fseek(Fproduit, pprod -> Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
                pprod -> Offset = *PTO;
                *PTO = pprod -> Adresse;
                fwrite(pprod, sizeof(struct fSequentielleFiche), 1, Fproduit);
            }
            ///The element is located in the middle of the FILE
            else
            {
                fseek(Fproduit, TmpPrec.Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
                fread(&TmpPrec, sizeof(struct fSequentielleFiche), 1, Fproduit);
                TmpPrec.Offset = pprod -> Adresse;
                fseek(Fproduit, TmpPrec.Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
                fwrite(&TmpPrec, sizeof(struct fSequentielleFiche), 1, Fproduit);

                fseek(Fproduit, pprod -> Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
                fread(pprod, sizeof(struct fSequentielleFiche), 1, Fproduit);
                pprod -> Offset = Tmp.Adresse;
                fseek(Fproduit, pprod -> Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
                fwrite(pprod, sizeof(struct fSequentielleFiche), 1, Fproduit);
            }
        }
        ///The element is the last one of the FILE and receives "-1"
        else
        {
            fseek(Fproduit, Tmp.Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
            fread(&Tmp, sizeof(struct fSequentielleFiche), 1, Fproduit);
            Tmp.Offset = pprod -> Adresse;
            fseek(Fproduit, Tmp.Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
            fwrite(&Tmp, sizeof(struct fSequentielleFiche), 1, Fproduit);

            fseek(Fproduit, pprod -> Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
            fread(pprod, sizeof(struct fSequentielleFiche), 1, Fproduit);
            pprod -> Offset = -1;
            fseek(Fproduit, pprod -> Adresse * sizeof(struct fSequentielleFiche), SEEK_SET);
            fwrite(pprod, sizeof(struct fSequentielleFiche), 1, Fproduit);
        }
    }
}

0 个答案:

没有答案