Fehlerhaftes Schreibverhalten in .txt aus Class



  • Ich will Attribute aus einer Class in eine txt File mit fprintf packen.

    Wenn ich folgeden Code ausführe, dann schreibt er zwar richtig in die Attribute der Class rein aber die Ausgabe in der Textdatei ist falsch.
    sie sieht nämlich so aus: 1,B,Quadro
    sollte aber: 1,Quadro,Audi
    zuerst soll ja der status, dann der name und dann die marke ausgegeben werden.
    er schreibt aber den stauts (ist ok) dann komischerweise die marke (und das noch falsch) und dann erst den namen. name und marke werden vertauscht. wieso???

    #include <stdio.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    class ClassCar
    {
    private:
        unsigned short int Status;
        unsigned short int CostPerWeekDay;
        unsigned short int CostPerWeekFinalDay;
        unsigned short int FlatMileageRate;
        unsigned short int BasicChargePerDay;
        string CarName;
        string CarBrand;
    
    public:
        // Get.Set->Status
        unsigned short int GetStatus()
        {   return(Status); }
        void SetStatus(unsigned short int fkt_Status)
        {   Status = fkt_Status;    }
    
        // Get.Set->CostPerWeekDay
        unsigned short int GetCostPerWeekDay()
        {   return(CostPerWeekDay); }
        void SetCostPerWeekDay(unsigned short int fkt_CostPerWeekDay)
        {   CostPerWeekDay = fkt_CostPerWeekDay;    }
    
        // Get.Set->CostPerWeekFinalDay
        unsigned short int GetCostPerWeekFinalDay()
        {   return(CostPerWeekFinalDay);    }
        void SetCostPerWeekFinalDay(unsigned short int fkt_CostPerWeekFinalDay)
        {   CostPerWeekFinalDay = fkt_CostPerWeekFinalDay;  }
    
        // Get.Set->FlatMileageRate
        unsigned short int GetFlatMileageRate()
        {   return(FlatMileageRate);    }
        void SetFlatMileageRate(unsigned short int fkt_FlatMileageRate)
        {   FlatMileageRate = fkt_FlatMileageRate;  }
    
        // Get.Set->BasicChargePerDay
        unsigned short int GetBasicChargePerDay()
        {   return(BasicChargePerDay);  }
        void SetBasicChargePerDay(unsigned short int fkt_BasicChargePerDay)
        {   BasicChargePerDay = fkt_BasicChargePerDay;  }
    
        // Get.Set->CarName
        string GetCarName()
        {   return CarName; }
        void SetCarName(string fkt_CarName)
        {   CarName = fkt_CarName;  }
    
        // Get.Set->CarBrand
        string GetCarBrand()
        {   return CarBrand;    }
        void SetCarBrand(string fkt_CarBrand)
        {   CarBrand = fkt_CarBrand;    }
    
    };
    
    int main()
    {
    ClassCar obj1;
    
    obj1.SetCarName("Carname");
    obj1.SetCarBrand("Carbrand");
    //obj1.SetBasicChargePerDay(100);
    //obj1.SetCostPerWeekDay(10);
    //obj1.SetCostPerWeekFinalDay(15);
    //obj1.SetFlatMileageRate(3);
    obj1.SetStatus(1);
    
    FILE * FilePointer = fopen("test.txt","w+");
    fprintf(FilePointer, "%d,%s,%s", obj1.GetStatus(), obj1.GetCarName(), obj1.GetCarBrand());
    fclose(FilePointer);
    
    return(1);
    }
    

    [ Dieser Beitrag wurde am 15.03.2003 um 13:51 Uhr von Peter Piksa editiert. ]



  • du versuchst einen string wie einen char* zu behandeln, das kan aber nicht gut gehen (du vergleichst Äpfel mit Birnen)

    Ich verschieb dich ins C++ Forum wo du hingehörst.

    verwende einfach C++ streams und du bist das Problem los.



  • FILE * FilePointer = fopen("test.txt","w+");
    fprintf(FilePointer, "%d,%s,%s", obj1.GetStatus().c_str(), obj1.GetCarName().c_str(), obj1.GetCarBrand().c_str());
    fclose(FilePointer);
    
    ofstream File("test.txt");
    File<<obj1.GetStatus()<<obj1.GetCarName()<<obj1.GetCarBrand();
    File.close();
    


  • Toll... 😞
    Das will alles nicht laufen 😞 😞 😞
    Ich habe das ganze jetzt mal ohne die Class String gemeacht weil das alles zu umständlich ist 😕

    Hier mal der Code

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    class ClassCar
    {
    private:
        unsigned short int Status;
        unsigned short int CostPerWeekDay;
        unsigned short int CostPerWeekFinalDay;
        unsigned short int FlatMileageRate;
        unsigned short int BasicChargePerDay;
        char CarName[50];
        char CarBrand[50];
    
        //string CarName;
        //string CarBrand;
    
    public:
        // Get.Set->Status
        unsigned short int GetStatus()
        {   return(Status); }
        void SetStatus(unsigned short int fkt_Status)
        {   Status = fkt_Status;    }
    
        // Get.Set->CostPerWeekDay
        unsigned short int GetCostPerWeekDay()
        {   return(CostPerWeekDay); }
        void SetCostPerWeekDay(unsigned short int fkt_CostPerWeekDay)
        {   CostPerWeekDay = fkt_CostPerWeekDay;    }
    
        // Get.Set->CostPerWeekFinalDay
        unsigned short int GetCostPerWeekFinalDay()
        {   return(CostPerWeekFinalDay);    }
        void SetCostPerWeekFinalDay(unsigned short int fkt_CostPerWeekFinalDay)
        {   CostPerWeekFinalDay = fkt_CostPerWeekFinalDay;  }
    
        // Get.Set->FlatMileageRate
        unsigned short int GetFlatMileageRate()
        {   return(FlatMileageRate);    }
        void SetFlatMileageRate(unsigned short int fkt_FlatMileageRate)
        {   FlatMileageRate = fkt_FlatMileageRate;  }
    
        // Get.Set->BasicChargePerDay
        unsigned short int GetBasicChargePerDay()
        {   return(BasicChargePerDay);  }
        void SetBasicChargePerDay(unsigned short int fkt_BasicChargePerDay)
        {   BasicChargePerDay = fkt_BasicChargePerDay;  }
    
        // Get.Set->CarName
            void SetCarName(void)
            {   printf("Type in the cars name: "); gets(this->CarName);  }
            char * GetCarName(char *n)
            {   strcpy(n,CarName); return(CarName); }
    
        // Get.Set->CarBrand
            void SetCarBrand(void)
            {   printf("Type in the cars brand: "); gets(this->CarBrand);    }
            char * GetCarBrand(char *n)
            {   strcpy(n,CarBrand); return(CarBrand);   }
    
        void WriteToDisk()
        {   
            FILE * FilePointer = fopen("test.txt","w+");
            fprintf(FilePointer, "%d,", Status);
            fprintf(FilePointer, "%s,", CarName);
            fprintf(FilePointer, "%s", CarBrand);   
            fclose(FilePointer);
    
        }
    };
    
    int main()
    {
    ClassCar obj1;
    char n[1];
    obj1.SetCarName();
    obj1.SetCarBrand();
    obj1.SetBasicChargePerDay(100);
    obj1.SetCostPerWeekDay(10);
    obj1.SetCostPerWeekFinalDay(15);
    obj1.SetFlatMileageRate(3);
    obj1.SetStatus(1);
    cout << obj1.GetStatus();
    cout << obj1.GetCarName(n);
    cout << obj1.GetCarBrand(n);
    obj1.WriteToDisk();
    
    return(1);
    }
    


  • wieso return 1?
    return 0; sollte reichen. und ganz ohne return geht's natürlich auch. aber was anderes als 0 gilt als Fehler.

    btw. geht der Code so jetzt?



  • ok, das mit return 0 wusste ich nicht.
    ja so läuft der code.
    allerdings habe ich ihn jetzt noch ein wenig verändert und habe probleme mit dem schreiben in die datei aber das krieg ich schon gebacken. 😉



  • Irgendwie scheint mein Compiler mich ver*****en zu wollen!!! 😡 😮

    Der ganze Sourcecode ist geblieben bis aud die WriteToDisk Methode ist ein bisschen geändert:

    void WriteToDisk()
        {   
            FILE * FilePointer = fopen("test.txt","a+");
            cout << this->Status;
            fprintf(FilePointer, "\n");
            fprintf(FilePointer, "%d,", Status);
            fprintf(FilePointer, "%s,", CarName);
            fprintf(FilePointer, "%s", CarBrand);   
            fclose(FilePointer);
        }
    

    Ich hatte eben immer falsche werte in der Textdatei an der Stelle "Status" stehen. dann habe ich rausgefunden dass wenn ich unten um Hauptprogramm die beiden zeilen

    cout << obj1.GetCarName(n);
    cout << obj1.GetCarBrand(n);
    

    A U S K O M M E N T I E R E, dieser Fehler nicht mehr auftritt. Wie kann das sein???????? 😕 😕



  • warum verwendest du nicht durchgehend C++, anstatt die Verwendung von streams und alten C-Funktionen zu mixen? Hat das einen bestimmten Grund? Mit Streams sollte das alles funktionieren...

    Mfg, smasher1985



  • Original erstellt von smasher1985:
    **warum verwendest du nicht durchgehend C++, anstatt die Verwendung von streams und alten C-Funktionen zu mixen? Hat das einen bestimmten Grund? Mit Streams sollte das alles funktionieren...

    Mfg, smasher1985**

    Ich wollte das ja auch alles mit strings machen, aber da haben sich mir zu grosse Probleme aufgetan, die ich nicht überwinden konnte (zumal ich damit noch nie gearbetet habe :()



  • was für Probleme denn?

    [ Dieser Beitrag wurde am 16.03.2003 um 11:48 Uhr von smasher1985 editiert. ]



  • #include <fstream>
    #include <string>
    using namespace std;
    
    //[...]
    
    void WriteToDisk()
        {   
            ofstream File("test.txt");
            cout << Status;
            File<<"\n";
            File<<Status;
            File<<CarName;
            File<<CarBrand;   
        }
    

    <A U S K O M M E N T I E R E, dieser Fehler nicht mehr auftritt. Wie kann das sein???????? >
    cout << obj1.GetCarName(n);
    cout << obj1.GetCarBrand(n);

    Eventuell modifizieren die Methoden GetCarName(n) und GetCarBrand(n) Deine Daten.

    [ Dieser Beitrag wurde am 17.03.2003 um 09:52 Uhr von Knuddlbaer editiert. ]



  • n ist exakt 1 byte groß
    du willst aber ne ganze zeichenkette in dieses 1 byte schreiben - funktioniert nicht.

    die get methoden sind sowieso etwas strange...

    vielleicht verwendest du besser std::string - das ist einfacher, denn du hast zeiger noch nicht wirklich verstanden. also nimm dir ein herz und verwende c++ - da kannst du solche fehler nicht machen.


Anmelden zum Antworten