

fflush(stdin): Gibt es denn noch andere Möglichkeiten den Tastaturbuffer zu leeren ?
Du könntest einfach stdin solange auslesen, bis nix mehr kommt.DanB hat geschrieben:fflush(stdin): Gibt es denn noch andere Möglichkeiten den Tastaturbuffer zu leeren ?
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
/********************************/
/* */
/*2130 */
/*Gestion d'une cave à vins */
/********************************/
struct reference
{
long IdReference;
char Nom[50];
char Millesime[5];
char Appellation[40];
char Region[40];
char Pays[30];
char Robe[30];
char Producteur[50];
int Format;
float DegreAlcool;
};
struct Ind
{
char Nom[50];
char Millesime[5];
long IdReference;
long posi;
};
int menu();
int menu_2();
int menu_3();
int EncodeRef(struct reference *,FILE *,FILE *);
int InsertionIdRef(struct reference *,FILE *);
void InsertionInd(struct Ind [],struct reference,int n);
int main()
{
FILE *pRef,*pIdRef;
int i,j,n=0,nreference=0;
char a[50],c;
struct reference refe;
long IdRef[100],temp;
struct Ind index[100];
pRef=fopen("Reference.dat","rb");
if(pRef==NULL)
{
perror("");
printf("On cree maintenant le fichier Reference.dat\n");
pRef=fopen("Reference.dat","w");
if(pRef!=NULL)
printf("Le fichier Reference.dat a ete creer avec succes\n");
else
perror("");
fclose(pRef);
}
else
{
fseek(pRef,0,SEEK_SET);
while(!feof(pRef))
{
fread(&refe,sizeof(struct reference),1,pRef); //(1.)Ich glaube hier liegt der Fehler
InsertionInd(index,refe,nreference);
nreference++;
}
}
pIdRef=fopen("IdReference.dat","rb");
if(pIdRef==NULL)
{
perror("");
printf("On cree maintenant le fichier IdReference.dat\n");
pIdRef=fopen("IdReference.dat","w");
if(pIdRef!=NULL)
printf("Le fichier Idreference a ete cree avec succes\n");
else
perror("");
fclose(pIdRef);
}
else
{
fseek(pIdRef,0,SEEK_SET);
while(!feof(pIdRef))
{
fread(&IdRef[n],sizeof(long),1,pIdRef);
n++;
}
for(j=1;j<n;j++)
{
temp=IdRef[j];
i=j-1;
while(i>=0&&IdRef[i]>temp)
{
IdRef[i+1]=IdRef[i];
i--;
}
IdRef[i+1]=temp;
}
}
//Menü für die Konsole
do
{
switch(i=menu())
{
case 1: switch(menu_2())
{
case 1: do
{
n=EncodeRef(&refe,pRef,pIdRef);
}while(n);
break;
case 2: printf("1 pour continuer et Enter pour quitter\n");
i=0;
do
{
printf("Nom:%s\n",index[i].Nom);
printf("Millesime:%s\n",index[i].Millesime);
printf("IdReference:%ld\n",index[i].IdReference);
i++;
c=getchar();
}while(c!='\0'&&i<nreference);
break;
case 3:
break;
}
break;
case 2: switch(menu_3())
{
case 1:
break;
case 2:
break;
}
break;
}
}while(i!=3);
return 0;
}
int menu()
{
int choix,sortie;
do
{
printf("1. Refrences\n");
printf("2. Ventes/Achats\n");
printf("3. Quitter\n");
do
{
fflush(stdin);
scanf("%d",&choix);
if(choix>0&&choix<4)
sortie=1;
else
printf("Error\n");
}while(choix<0||choix>3);
system("cls");
}while(sortie!=1);
return choix;
}
int menu_2()
{
int choix,sortie;
do
{
printf("1. Ajouter des references\n");
printf("2. Afficher les caracteristiques des references suivant l'ordre d'index\n");
printf("3. Rechercher une reference à partir de son Nom et son Millesime\n");
printf("4. Quitter\n");
do
{
fflush(stdin);
scanf("%d",&choix);
if(choix>0&&choix<5)
sortie=1;
else
printf("Error\n");
}while(choix<0||choix>4);
system("cls");
}while(sortie!=1);
return choix;
}
int menu_3()
{
int choix,sortie;
do
{
printf("1. Ajout des achats/ventes de references a une date donnee chez un fournisseur\n");
printf("2. Affichage sequentiel du fichier\n");
printf("3. Quitter\n");
do
{
fflush(stdin);
scanf("%d",&choix);
if(choix>0&&choix)
sortie=1;
else
printf("Error\n");
}while(choix<0||choix>3);
system("cls");
}while(sortie!=1);
return choix;
}
//Einlesen der parameter in die datei
int EncodeRef(struct reference *pv, FILE *pRef,FILE *pIdRef)
{
int c;
pRef=fopen("Reference.dat","ab+");
if(pRef==NULL)
perror("");
pIdRef=fopen("IdReference.dat","ab+");
if(pIdRef==NULL)
perror("");
do
{
printf("IdReference:");
fflush(stdin);
scanf("%ld",&pv->IdReference);
if(pv->IdReference=='\n')
return 0;
if(c==0)
fseek(pIdRef,0,SEEK_END);
c=InsertionIdRef(pv,pIdRef);
}while(c);
fwrite(&pv->IdReference,sizeof(long),1,pIdRef);
fflush(stdin);
printf("Nom:");
gets(pv->Nom);
fflush(stdin);
printf("Millesime:");
gets(pv->Millesime);
fflush(stdin);
printf("Appellation:");
gets(pv->Appellation);
fflush(stdin);
printf("Region:");
gets(pv->Region);
fflush(stdin);
printf("Pays:");
gets(pv->Pays);
fflush(stdin);
printf("Robe:");
gets(pv->Robe);
fflush(stdin);
printf("Producteur");
gets(pv->Producteur);
fflush(stdin);
printf("Format:");
scanf("%d",&pv->Format);
fflush(stdin);
printf("DegreeAlcool:");
scanf("%f",&pv->DegreAlcool);
fwrite(pv,sizeof(struct reference),1,pRef);
fclose(pRef);
fclose(pIdRef);
return 0;
}
//Algorythmus um die Referenznummern zu ordnen, aufsteigend
int InsertionIdRef(struct reference *pv, FILE *pIdRef)
{
long a;
fseek(pIdRef,0,SEEK_SET);
while(!feof(pIdRef))
{
fread(&a,sizeof(long),1,pIdRef);
if(pv->IdReference==a)
return 1;
}
return 0;
}
/*1. Kopieren der Werte der Struktur in eine andere
2. Algorythmus um die strukturen nach ihren Namen zu sortieren, alphabetisch,
bei gleichem Namen, nach dem Jahr, absteigend*/
void InsertionInd(struct Ind index[],struct reference refe,int nreference)
{
int i,j;
struct Ind temp;
index[nreference].IdReference=refe.IdReference; //(2.)
strcpy(index[nreference].Nom,refe.Nom);
strcpy(index[nreference].Millesime,refe.Millesime);
index[nreference].posi=nreference;
for(j=1;j<nreference;j++)
{
i=j-1;
while(i>=0&&strcmp(index[i].Nom,index[j].Nom)>0)
{
temp=index[i];
index[i]=index[j];
index[j]=temp;
j=i;
i--;
}
while((i>=0) && (strcmp(index[i].Nom,index[j].Nom)==0) && (strcmp(index[i].Millesime,index[j].Millesime)<0)) //Millesime ist eine Zahl, da aber vom Typ char und mit fgets eingelesen, wird strcmp anstatt der logischen operation verwendet
{
temp=index[i];
index[i]=index[j];
index[j]=temp;
j=i;
i--;
}
}
}