我需要使用索引顺序访问方法在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);
}
}
}