Konsolen eingabe in Binärdatei schreiben



  • Hallo,

    ich versuche gerade die Benutzereingabe aus der Konsole in eine Binärdatei zu schreiben, mit folgendem Code:

    void DateiVerwaltung::writeBin()
    {
        std::ofstream file;
        std::string eingabe;
    
        int nZahl;
        float fZahl;
        char c;
    
        file.open(binDatei, std::ios::out | std::ios::binary);
        do {
            std::cout << "Wert: ";
            std::cin >> eingabe;
            if( (sscanf(eingabe.c_str(), "%f", &fZahl)) == 1 && eingabe.find(".") != std::string::npos ) {
                file.write((char*)&fZahl, sizeof(float));
                std::cout << "Float geschrieben" << std::endl;
            }
            else if( (sscanf(eingabe.c_str(), "%d", &nZahl)) == 1) {
                file.write((char*)&nZahl, sizeof(int));
                std::cout << "int geschrieben" << std::endl;
            }
            else if( eingabe.length() == 1 && (sscanf(eingabe.c_str(), "%c", &c)) == 1) {
                file.write((char*)&c, sizeof(char));
                std::cout << "char geschrieben" << std::endl;
            }
            else {
                file.write( eingabe.c_str(), sizeof(char)*eingabe.length());
                std::cout << "string geschrieben" << std::endl;
            }
    
            std::cout << "weiteren Wert hinzufuegen? (j/n): ";
            std::cin >> eingabe;
            if(eingabe == "n" || eingabe == "N")
                break;
    
        } while(true);
    
        file.close();
    }
    

    Frage: Ist das soweit OK? und wenn ja gibt es da evtl. bessere/schönere Möglichkeiten die Eingabe richtig zu konvertieren ohne den Benutzer nach dem Datentyp zufragen?



  • hm... gibt es einen Grund für

    if( (sscanf(eingabe.c_str(), "%f", &fZahl)) == 1 && eingabe.find(".") != std::string::npos )
    

    ginge doch auch

    if(cin >> f){
                // do something here
          }
    

    wieso multiplizierst du die Anzahl der Elemente mit char?
    Die Anzahl bleibt doch eh immer gleich 😉



  • Ist den die Bedingung

    if(cin >> f){
                // do something here
          }
    

    dann nicht immer Wahr? Es sollen ja 4 verschiedene Typen gespeichert werden... 😕

    sizeof(char) == 1 Byte und string hat doch X Bytes

    Evtl. noch zur Info die Datei soll später wieder gelesen werden und die Werte auf der Konsole ausgegeben werden.


Anmelden zum Antworten