Probleme mit Punkt und Komma sowie der änderung eines char



  • Hallo,

    ich habe folgendes Problem: Ich habe eine Datei werte.txt in der ich Werte für eine andere Berechnung habe. Ich möchte diese Datei jetzt verändern und das mit einer schönen Oberfläche... Daher habe ich mit Borland folgenden Code geschrieben:

    void __fastcall TForm1::ButtonWerteClick(TObject *Sender)
    {
    int n;
    double Werte[14];
    double eingangswerte[14];
    
    Werte[0]     = Edit4->Text.ToDouble();
    Werte[1]     = Edit5->Text.ToDouble();
    Werte[2]     = Edit6->Text.ToDouble();
    Werte[3]     = Edit7->Text.ToDouble();
    Werte[4]     = Edit8->Text.ToDouble();
    Werte[5]     = Edit9->Text.ToDouble();
    Werte[6]     = Edit10->Text.ToDouble();
    Werte[7]     = Edit11->Text.ToDouble();
    Werte[8]     = Edit12->Text.ToDouble();
    Werte[9]     = Edit13->Text.ToDouble();
    Werte[10]    = Edit14->Text.ToDouble();
    Werte[11]    = Edit15->Text.ToDouble();
    Werte[12]    = Edit16->Text.ToDouble();
    Werte[13]    = Edit17->Text.ToDouble();  //hier möchte ich wenn ich den Button klicke alle Werte in den ""Edits" einlesen damit ich sie später als double verwenden kann.
    
    std::ifstream datei("werte.txt");
    char dummya[14][30];  //geht das überhaupt so??? Das Program läuft soweit aber sich bin ich mir nicht
    char dummyb[14][30];
    char dummyc[14][30];
    int j;
    
    for (n=0; n<14; n++){
    datei.getline(dummya[n], 30, '|'); // Hier möchte ich die Werte die ich aus der Datei gelesen habe in die Variablen packen
    datei.getline(dummyb[n], 30, '|');
    datei.getline(dummyc[n], 30);
    eingangswerte[n]=strtod(dummyb[n],NULL); // Und die Zahl zu einer double umformen
    }\\Das Einlesen der Werte mache ich um sie anzeigen zu können.
    datei.close();
    
    fstream dat_werte;
    dat_werte.open("werte.txt", ios::out);
    for (n = 0; n < 14 ; n++){
    	dat_werte << dummya[n] <<  "|"  << Werte[n] << "|" << dummyc[n] << "\n";
    }
    dat_werte.close(); // hier sollen dann die "neuen" Werte in die Datei gespeichert werden
    }
    

    Der Inhalt von Werte sieht etwa so aus :
    Wert |5.3| kg
    Wert |8.02| m

    Soweit geht auch alles aber beim einlesen der Werte aus der Datei zeigt er mir sie dann mit einem . an so wie sie auch in der Datei stehen. In dem Edit Fenster muss ich sie dann aber mit einem , eingeben.

    Wie kann ich jetzt also das punkt in dem char zu nem Komma machen? Weil dann kann ich ja gleich ein Komma anzeigen lassen und alles ist ok.
    Vlt gleich noch ne andere Frage die auch darauf hinzielt. Wie kann ich kontrolieren, dass im Edit auch wirlich eine double steht?

    danke und Gruß
    Axel



  • Axel_2010 schrieb:

    Wie kann ich jetzt also das punkt in dem char zu nem Komma machen?

    In dem du den array nach einem Punkt durchsuchst und ihn durch ein Komma ersetzt.

    char wert[10] = "325.45788";
    
        for(int i=0;i<10;i++)
        {
            if(wert[i] == '.'){wert[i]= ',';}
        }
    


  • Nebukat schrieb:

    Axel_2010 schrieb:

    Wie kann ich jetzt also das punkt in dem char zu nem Komma machen?

    In dem du den array nach einem Punkt durchsuchst und ihn durch ein Komma ersetzt.

    char wert[10] = "325.45788";
        
        for(int i=0;i<10;i++)
        {
            if(wert[i] == '.'){wert[i]= ',';}
        }
    

    Oh - ein Rad ! Das hat ja noch nie jemand gebraucht .... 😉

    replace ist Dein Freund:

    #include <algorithm>
    
    char wert[10] = "325.45788";
    std::replace(wert, wert+10, ',', '.');
    

    "ersetzen" ... "replace" .... klingelt da was ? 😉

    Übrigens: Wenn man gleich std::string verwendet hätte, gäb's da noch std::string::replace(), der noch viele andere schöne Dinge kann (z.B. Ersetzen unterschiedlich langer Zeichenfolgen).

    Gruß,

    Simon2.



  • Leider ein Rad was noch nicht rollt.

    Bei mir sehe das dann ja aufgrund der For-schleife so aus :

    for (n=0; n<14;n++){
    //... (erster Beitrag)
    std::replace(dummy[n],dummy[n]+14,",",".");
    }
    

    Folgende Ausgabe erscheint:
    [BCC32 Fehler] algorithm(545): E2034 Konvertierung von ´char´nach ´const char *´ nicht möglich

    Die selbe Fehlermeldung kommt übrigens auch bei der Methode von Nebukat. Nur was anderes vor dem Doppelpunkt...

    Gruß und Danke
    Axel



  • Dann vergleiche doch nochmal Deinen Code mit dem von Simon. Achte dabei speziell auf die Schleife. (Würde ich zuviel verraten wenn ich darauf hinweise dass diese bei Simon fehlt?)



  • korrekt das ist mir auch schon aufgefallen. 💡

    Das ist ja sicherlich auch eine tolle Sache aber sie löst mein Problem nicht, da ich ja nunmal die Schleife zum Einlesen der Werte habe !



  • Habe nochmal was getestet :

    char testen[14] = "12345.1234567";
    std::replace(testen,testen+14,".",",");
    

    Ruft die selbe Fehlermeldung hervor wie im Beitrag vorher beschrieben...



  • so genau kann ich dir das auch nicht sagen...
    aber warum muss in der parameterliste das feld und das feld+14 stehen?

    ist damit "von"-"bis" gemeint?

    Aber was du mal probieren könntest:
    anstelle der Verwendung von "." und "," einfach mal '.' und ',' verwenden, da du ja mit einzelnen chars hantierst nicht mit strings oder zeichenketten.



  • Hi,

    habe ich auch schon probiert. Dann hat er aber den Fehler gemeldet, dass die Fkt nicht richtig aufgerufen ist.

    Bin voll am verzweifeln... 😞



  • Du hast es also so probiert?

    char testen[14] = "12345.1234567";
    std::replace(testen,testen+14,'.',',');
    


  • schau nochmal gaaaanz genau hin:

    Axel_2010 schrieb:

    ...

    std::replace(testen,testen+14,".",",");
    

    ...

    Simon2 schrieb:

    ...

    std::replace(wert, wert+10, ',', '.');
    

    ...

    Zusatztipp: Es liegt weder daran, dass es bei mir "wert" und bei Dir "testen" heißt, noch daran, dass es bei mir 10 und bei Dir 14 Elemente sind ....

    Gruß,

    Simon2.


Anmelden zum Antworten