Dateizugriff, schreiben/lesen

Schnelle objektorientierte, kompilierende Programmiersprache.
DanB
Beiträge: 7
Registriert: Di Mär 29, 2016 10:24 am

Re: Dateizugriff, schreiben/lesen

Beitrag von DanB » Di Mär 29, 2016 9:21 pm

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 :D die Fragen waren aber nicht umsonst, ich komme jetzt endlich weiter :D
fflush(stdin): Gibt es denn noch andere Möglichkeiten den Tastaturbuffer zu leeren ?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Dateizugriff, schreiben/lesen

Beitrag von Xin » Di Mär 29, 2016 11:47 pm

DanB hat geschrieben:fflush(stdin): Gibt es denn noch andere Möglichkeiten den Tastaturbuffer zu leeren ?
Du könntest einfach stdin solange auslesen, bis nix mehr kommt.
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.

DanB
Beiträge: 7
Registriert: Di Mär 29, 2016 10:24 am

Re: Dateizugriff, schreiben/lesen

Beitrag von DanB » Do Mär 31, 2016 5:08 pm

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--;
        }
    }
}

Antworten