Ja, hab mir die Aufgabenstellung nochmal genauer durchgelesen(Ist alles auf Französisch und ziemlich viel Text) habe es jetzt aber begriffen, für die long Variablen habe ich nochmal eine eigene Datei, das heisst ich muss die strings beim lesen nicht überspringen oder unnötig testen die Fragen waren aber nicht umsonst, ich komme jetzt endlich weiter
fflush(stdin): Gibt es denn noch andere Möglichkeiten den Tastaturbuffer zu leeren ?
Dateizugriff, schreiben/lesen
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Dateizugriff, schreiben/lesen
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 ?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Dateizugriff, schreiben/lesen
Hallo, ich bins nochmal, bin jetzt was weiter gekommen, jetzt liegt das Problem aber bei einem fread(); d.h., ich glaube beim einlesen von der Datei und das speichern in eine struct(1.), anschliessend kopiere ich die Werte von der struct die gerade die Werte von der Datei erhalten hat in eine andere struct(2.) und ich glaub da ist irgendwas falsch, denn wenn ich mir die Struktur anzeigen lasse, zeigt der für index[0].Nom, den ersten Namen an und den zweiten Namen, der zweite müsste ja logischerweise erst bei index[1].Nom auf der Konsole erscheinen, das gleiche mit IdReference und Millesime.
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--;
}
}
}