Probleme mit fseek, kann keine Datein erstellen



  • Tach Leute,
    habe ein Problem, wo ich einfach nicht weiter komme. Das Programm wird compeliert und startet auch, aber wenn dann eine Funktion benutzt wird, schmiert alles ab und Borand zeigt mir ein Fehler an folgender Quellcode Zeile an. Evtl. kann mir ja jemand weiter helfen.
    Code:
    ------------------------------------------------------------------------------

    #include<iostream>
    #include<conio>
    #include<string>
    #include<windows>
    #include<fstream>
    using namespace std;
    //Definitionen von Variablen
    struct datensatz
    {
    int nummer;
    string typ;
    string kategorie;
    int kilowatt;
    char vermietet[1];
    };
    
    int i=0, satzadresse, fertig=0;
    string passwort1,passwort2,passwort3,passwort4,passwort5,passwort6,passwort7,passwort8;
    string passworte;
    void anlegen();
    int lesen(char ausgabe);
    void erweitern();
    void aendern();
    char noch_ein='j',was,dateiname[30];
    FILE *dat;
    struct datensatz autos;
    //Funktion Passwort
    void passwort()
    {
    do
    {
    cout<<"Bitte Passwort eingeben: ";
    passwort1=getch();
    cout<<"*";
    passwort2=getch();
    cout<<"*";
    passwort3=getch();
    cout<<"*";
    passwort4=getch();
    cout<<"*";
    passwort5=getch();
    cout<<"*";
    passwort6=getch();
    cout<<"*";
    passwort7=getch();
    cout<<"*";
    passwort8=getch();
    cout<<"*"<<endl;
    passworte=passwort1+passwort2+passwort3+passwort4+passwort5+passwort6+passwort7+passwort8;
    cout<<"Das Passwort ist falsch! Versuchen Sie es noch ein mal"<<endl;
    }
    while(passworte!="snoopy12");
    
    clrscr();
    gotoxy(15,2);
    cout<<"Willkommen in meinem Programm"<<endl;
    }
    
    //Funktion aendern
    void aendern()
    {
    dat=fopen("d:\autos.dat","r+");
    cout<<"Welcher Datensatz soll geaendert werden? "<<"Nr: ";cin>>satzadresse;
    cout<<endl;
    cout<<satzadresse<<" .Typ eingeben "<<endl;
    cin>>autos.typ;
    do
    {
    cout<<"Kategorie eingeben (A bis E in Grossbuchstaben) ";
    cin>>autos.kategorie;
    if(autos.kategorie!="A"&&autos.kategorie!="B"&&autos.kategorie!="C"&&autos.kategorie!="D"&&autos.kategorie!="E")
    {
    cout<<"Die Kategorie muss zwischen A und E sein! "<<endl;
    }
    }
    while(autos.kategorie!="A" && autos.kategorie!="B" && autos.kategorie!="C" && autos.kategorie!="D" && autos.kategorie!="E");
    cout<<"Kilowattanzahl des Fahrzeugs eingeben: "<<endl;
    cin>>autos.kilowatt;
    cout<<"Ist das Auto gerade vermietet? (j/n) "<<endl;
    cin>>autos.vermietet;
    
     :arrow_right: fseek(dat,(satzadresse-1)* sizeof(struct datensatz),SEEK_SET);  // Hier Fehler
    autos.nummer=satzadresse;
    fwrite(&autos,sizeof(struct datensatz),1,dat);
    fclose(dat);
    }
    
    //Funktion erweitern
    void erweitern()
    {
    i=lesen('n');
    noch_ein='j';
    dat=fopen("d:\autos.dat","a+");
    while(noch_ein=='j')
    {
    i++;
    satzadresse=i;
    autos.nummer=satzadresse;
    cout<<"\n\n Eingabe neuer Datensatz fuer Autos "<<endl;
    cout<<i<<" .Typ eingeben "<<endl;
    cin>>autos.typ;
    do
    {
    cout<<"Kategorie eingeben (A bis E in Grossbuchstaben) "<<endl;
    cin>>autos.kategorie;
    if(autos.kategorie!="A"&&autos.kategorie!="B"&&autos.kategorie!="C"&&autos.kategorie!="D"&&autos.kategorie!="E")
    cout<<"Die Kategorie muss zwischen A und E sein! "<<endl;
    }
    while(autos.kategorie!="A" && autos.kategorie!="B" && autos.kategorie!="C" && autos.kategorie!="D" && autos.kategorie!="E");
    cout<<"Kilowattanzahl des Fahrzeugs eingeben: "<<endl;
    cin>>autos.kilowatt;
    cout<<"Ist das Auto gerade vermietet? (j/n) "<<endl;
    cin>>autos.vermietet;
    
     :arrow_right: fseek(dat,(satzadresse-1)* sizeof(struct datensatz),SEEK_SET); //Hier
    fwrite(&autos,sizeof(struct datensatz),1,dat);
    cout<<"\nNoch ein Datensatz eingeben? j/n ";noch_ein=getch();
    if(noch_ein=='n')
    {
    fclose(dat);
    }
    }
    }
    
    //Funktion Anlegen
    void anlegen()
    {
    noch_ein='j';
    while(noch_ein=='j')
    {
    if(i==0)
    {
    dat=fopen("d:\autos.dat","w");
    }
    i++;
    satzadresse=i;
    autos.nummer=satzadresse;
    cout<<"\n\n Eingabe neuer Datensaetze fuer Autos\n ";
    cout<<i<<" .Typ eingeben "<<endl;
    cin>>autos.typ;
    do
    {
    cout<<"Kategorie eingeben (A bis E in Grossbuchstaben) ";
    cin>>autos.kategorie;
    if(autos.kategorie!="A"&&autos.kategorie!="B"&&autos.kategorie!="C"&&autos.kategorie!="D"&&autos.kategorie!="E")
    cout<<"Die Kategorie muss zwischen A und E sein! "<<endl;
    }
    while(autos.kategorie!="A" && autos.kategorie!="B" && autos.kategorie!="C" && autos.kategorie!="D" && autos.kategorie!="E");
    cout<<"Kilowattanzahl des Fahrzeugs eingeben: ";
    cin>>autos.kilowatt;
    cout<<"Ist das Auto gerade vermietet? (j/n) ";
    cin>>autos.vermietet;
    
     :arrow_right: fseek(dat,(satzadresse-1)* sizeof(struct datensatz),SEEK_SET); //Hier
    fwrite(&autos,sizeof(struct datensatz),1,dat);
    cout<<"\nNoch einen Datensatz eigeben? j/n ";
    noch_ein=getch();
    if(noch_ein=='n')
    {
    fclose(dat);
    }
    }
    }
    
    //Funktion Lesen
    int lesen(char ausgabe)
    {
    i=0;
    dat=fopen("d:\autos.dat","r");
    if(ausgabe=='j')
    {
    cout<<"\n\nAusgabe der gespeicherten Datensaezte: ";
    fertig=1;
    while(fertig!=0)
    {
    i++;
    satzadresse=i;
     :arrow_right: fseek(dat,(satzadresse-1)* sizeof(struct datensatz),SEEK_SET); //Hier
    fertig=fread(&autos,sizeof(struct datensatz),1,dat);
    if (fertig!=0&&ausgabe=='j')
    {
    cout<<"\nSatzadresse "<<autos.nummer<<"     ";
    cout<<"\nTyp: "<<autos.typ<<endl;
    cout<<"Kategorie: "<<autos.kategorie<<endl;
    cout<<"Kilowatt: "<<autos.kilowatt<<endl;
    cout<<"Vermietet? "<<autos.vermietet<<endl;
    getch();
    }
    }
    }
    }
    //Hauptprogramm
    main()
    {
    char was;
    passwort();
    do
    {
    cout<<"Was moechten Sie tun? "<<endl;
    cout<<"1 ==>   Auto vermieten           "<<endl;
    cout<<"2 ==>   Abrechnung anfertigen    "<<endl;
    cout<<"3 ==>   Neuen Datensatz anlegen  "<<endl;
    cout<<"4 ==>   Einen Datensatz lesen    "<<endl;
    cout<<"5 ==>   Einen Datensatz aendern  "<<endl;
    cout<<"6 ==>   Einen Datensatz erweitern"<<endl;
    cout<<"ESC ==> Das Programm beenden     "<<endl;
    was=getch();
    switch(was)
    {
    case '1':cout<<"kommt noch";break;
    case '2':cout<<"kommt auch noch";break;
    case '3':anlegen();break;
    case '4':int lesen(char);break;
    case '5':aendern();break;
    case '6':erweitern();break;
    case 27:cout<<"E n d e ";
    default :cout<<"Fehler in der Eingabe, starten sie das Programm neu ";break;
    }
    }
    while(was!=27);
    fclose(dat);
    getch();
    return 0;
    }
    

    ------------------------------------------------------------------------------

    Die Fehlermeldung kommt immer in der Zeile, die mit "fseek" anfängt.(Oben makiert)
    Ich hoffe das keine größeren Fehler enthalten sind. Ändern möchte ich eigendlich nicht so viel. Es würde mir reichen, wenn er endlich dei Datei anlegt:)

    Danke im Vorraus

    Edit by AJ: C/C++ Tags eingefügt; bitte das nächste mal selber machen (die Codetags sind gleich unter den Smilies ;))



  • @bad_blade,
    habe mir deinen Quellcode jetzt nicht komplett durchgelesen (ohne Code-Tags macht das keinen Spaß 🙄 ).

    Die einzige Gefahr die ich sehe, ist der Dateizeiger. Überprüfe mal das Ergebis von fopen. Wenn du hier NULL zurückbekommst, hast du den Fehler warscheinlich gefunden.


Anmelden zum Antworten