Eingabe und Ausgabe



  • Guten Tag liebes Forum,
    ich habe folgendes Problem, ich muss Zahlen aus einer Textdatei einlesen und als Hexadezimalzahl wieder ausgeben.
    Wie ich eine Dezimalzahl in eine Hexadezimalzahl wiedergebe weiß ich ja aber ich weiß nicht wie ich die Zahl aus der Textdatei einlesen kann.

    int main() {
    
       int i = 1343;
    
       cout << showbase << hex << i << endl;
        
    
    }
    

    Die Ausgabe ist dann 0x53f.
    Statt i einzulesen würde ich gerne meine "eingabe.txt" einlesen, in der auch Wörter und double-Werte sind, die aber für die Umstellung auf Hexadezimal natürlich nicht relevant sind.


  • Mod

    Wüsstest du, wie du es aus der Standardeingabe (cin) einliest? Dann geht's aus einer Datei exakt genauso, außerdass du statt cin halt einen ifstream zu deiner Datei nimmst.

    @KogoroMori21 sagte in Eingabe und Ausgabe:

    Statt i einzulesen würde ich gerne meine "eingabe.txt" einlesen, in der auch Wörter und double-Werte sind, die aber für die Umstellung auf Hexadezimal natürlich nicht relevant sind.

    Die sind aber sehr relevant für's Einlesen, denn du musst ja gezielt irgendwie das finden, was du verarbeiten möchtest. Also: Was weißt du?



  • Ja genau das ist mein Problem, ich kann die Textdatei mit

    while(getline(file,line){
      cout << line << endl;
    }
    

    ausgeben aber ich weiß nicht wie ich gezielt das finde was ich verarbeiten möchte.
    Die erste Zeile der Textdatei ist Beispielsweise:
    1343 4.23423434 HalloWelt
    und ich möchte jetzt nur die 1343 verarbeiten. Da weiß ich nun nicht wie das funktioniert.



  • @KogoroMori21
    Du könntest mit

    string wort;
    while(file >> wort){
    //untersuche wort
    }
    

    alle durch whitespace getrennten Bestandteile Deiner Datei einlesen und nachsehen, ob sie nur aus Ziffern bestehen, und dann entsprechend weitermachen.


  • Mod

    @KogoroMori21 sagte in Eingabe und Ausgabe:

    Ja genau das ist mein Problem, ich kann die Textdatei mit

    while(getline(file,line){
      cout << line << endl;
    }
    

    ausgeben aber ich weiß nicht wie ich gezielt das finde was ich verarbeiten möchte.
    Die erste Zeile der Textdatei ist Beispielsweise:
    1343 4.23423434 HalloWelt
    und ich möchte jetzt nur die 1343 verarbeiten. Da weiß ich nun nicht wie das funktioniert.

    Was zeichnet denn 1343 als das aus, was du umrechnen möchtest?
    a) Es ist das erste Wort in der Datei, d.h. du möchtest genau das erste Wort und sonst nichts umrechnen?
    b) Es ist eine Ganzzahl, d.h. du möchtest alles in der Datei umrechnen, das wie eine Ganzzahl aussieht?
    c) Es ist das erste Wort in der Zeile, d.h. du möchtest jedes erste Wort in jeder Zeile umrechnen?
    d) Eine Kombination aus meinen Vorschlägen oder etwas ganz anderes?



  • b) trifft es zu, ich muss alle Ganzzahlen in der Datei in Hexadezimal umwandeln


  • Mod

    @KogoroMori21 sagte in Eingabe und Ausgabe:

    b) trifft es zu, ich muss alle Ganzzahlen in der Datei in Hexadezimal umwandeln

    Wir haben also den Fall, dass wir durch jedes Wort in der Datei gehen wollen, und wenn etwas bestimmtes auf das Wort zutrifft, wollen wir etwas machen. Dazu brauchen wir die bisherigen beiden Ideen:

    @Belli sagte in Eingabe und Ausgabe:

    @KogoroMori21
    Du könntest mit

    string wort;
    while(file >> wort){
    //untersuche wort
    }
    

    alle durch whitespace getrennten Bestandteile Deiner Datei einlesen und nachsehen, ob sie nur aus Ziffern bestehen, und dann entsprechend weitermachen.

    und

    @KogoroMori21 sagte in Eingabe und Ausgabe:

    cout << showbase << hex << i << endl;

    und kombinieren diese:

    	string wort;
    	while(cin >> wort)
    	{
                   //untersuche wort
    
                    // ?
    
    		cout << showbase << hex << i << endl;
    	}
    

    Es fehlt aber noch der entscheidende Teil: Worauf untersuchen wir? Außerdem wollen wir ja auch noch einen int haben, für die Umrechnung, aber wir starten mit einem string. Das trifft sich günstig, denn was wir untersuchen wollen ist ja gerade, ob der String als int gelesen werden kann! Also versuchen wir es doch einfach, und wen nes klappt, wissen wir, dass wir eine Ganzzahl vorliegen haben. Und andernfalls tun wir einfach nichts und gehen zum nächsten Wort in der Datei:

    	string wort;
    	while(cin >> wort)
    	{
    		try
    		{
    			int i;
    			i = stoi(wort);
    			cout << showbase << hex << i << endl;
    		} catch (invalid_argument){};
    	}
    

    Das ist schon ganz gut, und wird sicherlich viele Anforderungen erfüllen und ist auch recht verständlich. Wenn wir die Anforderung, dass das Wort genau eine Ganzzahl sein soll, aber wörtlich nehmen, sind wir noch nicht fertig. stoi hat nämlich die "dumme" Angewohnheit, viel zu nett zu sein. Das nimmt auch einen String "34sdsfsd" und macht daraus ohne Murren die Zahl 34. Und auch aus "34.4345" macht es 34, was wir ebenfalls nicht wollen. Um das zu wissen, muss man entweder sehr penibel die Anleitung gelesen haben oder seine Programme sehr rigoros testen.

    Schönerweise hält die Anleitung aber auch gleich die Lösung parat: stoi hat noch weitere Parameter, und einer davon ist die Rückgabe der Anzahl der Zeichen, die konvertiert werden konnten. Wie wissen wir also, ob das gesamte Wort eine Zahl ist und nichts anderes enthält? Indem wir gucken, ob die Anzahl der von stoi konvertierten Zeichen gleich der Länge des Wortes ist!

    	string wort;
    	while(cin >> wort)
    	{
    		try
    		{
    			int i;
    			size_t num_converted;
    			i = stoi(wort, &num_converted);
    			if (num_converted == wort.size())
    				cout << showbase << hex << i << endl;
    		} catch (invalid_argument){};
    	}
    

    Tadaa!

    Hier als Programm mit cin zum Spielen und Testen, musst du nur noch deine Datei stattdessen einbauen:
    https://ideone.com/pYbKKE

    Ein wichtiger Aspekt ist hier, dass man generell versuchen sollte, Dinge einfach zu tun, und zu gucken, ob sie dann fehlschlagen, anstatt vorher selber zu prüfen, ob die Dinge wohl gelingen werden. Denn oft vergisst man dabei etwas, oder macht etwas falsch. Zum Beispiel kommt unser Programm nun auch Problemlos mit Vorzeichen klar (auch so etwas wie "+123"). Wer hätte bei einer eigenen Prüfroutine daran gedacht, dass das auch eine gültige Ganzzahl ist?



  • @SeppJ sagte in Eingabe und Ausgabe:

    Ein wichtiger Aspekt ist hier, dass man generell versuchen sollte, Dinge einfach zu tun, und zu gucken, ob sie dann fehlschlagen, anstatt vorher selber zu prüfen, ob die Dinge wohl gelingen werden. Denn oft vergisst man dabei etwas, oder macht etwas falsch. Zum Beispiel kommt unser Programm nun auch Problemlos mit Vorzeichen klar (auch so etwas wie "+123"). Wer hätte bei einer eigenen Prüfroutine daran gedacht, dass das auch eine gültige Ganzzahl ist?

    ➕ 1⃣

    Danke. Kann nicht oft genug gesagt/geschrieben werden. 🙂



  • @SeppJ Danke für diese ausfühliche Antwort! Das hat mir sehr weitergeholfen:)
    Ich probiere jetzt die restlichen Sachen aus der Textdatei zu bearbeiten



  • Guten Tag Leute,
    sorry das ich mich jetzt nochmal melden muss aber ich komme nun nicht beim lesen des Double-Wertes und des Strings weiter.
    Der Double-Wert von Beispielsweise 4.23423434 muss mit sechs Zeichen wiedergegeben werden, dafür verwende ich ja

    double d = 4.23423434;   //diese Zahl sollte direkt aus der Textdatei gelesen werden und dient nur als Beispiel
    
    cout << setprecision(6) << d << endl;
    

    Die Ausgabe ist dann 4.23423 und somit ist das auch richtig.

    Beim String muss das Wort eine Länge von 15 haben und fehlende Ziffern sollen mit ('-') aufgefüllt werden.
    Beispiel:

    string s = "HalloWelt"; // soll ebenfalls aus der Textdatei eingelesen werden
    
    cout << setw(15) << setfill('-') << s << endl;
    

    Die Ausgabe ist dann ------HalloWelt und auch das ist richtig.

    Nun ist mein Problem das ich nicht weiß wie ich das mit in den Code von Beispielsweise @SeppJ integrieren soll. Ich weiß ja wie man was bearbeitet aber ich weiß nicht wie ich es aus der Textdatei einlesen kann und ausgeben kann.


  • Mod

    @KogoroMori21 sagte in Eingabe und Ausgabe:

    Nun ist mein Problem das ich nicht weiß wie ich das mit in den Code von Beispielsweise @SeppJ integrieren soll.

    Na, überhaupt nicht. Wie kommt es, dass die Anforderungen nun auf einmal völlig andere sind? Ist doch klar, dass mein Programm dazu nicht passen kann. Das kommt davon, wenn man nicht nach dem fragt, was man eigentlich wissen möchte.



  • @SeppJ Sorry, ich wollte ja auch zuerst nur wissen ich die Dezimalzahlen einlesen kann und in Hexa umwandeln kann, weil ich dachte ich kriege das für Double und String dann auch schon hin.


  • Mod

    @KogoroMori21 sagte in Eingabe und Ausgabe:

    @SeppJ Sorry, ich wollte ja auch zuerst nur wissen ich die Dezimalzahlen einlesen kann und in Hexa umwandeln kann, weil ich dachte ich kriege das für Double und String dann auch schon hin.

    So ganz daneben ist mein Ansatz für die geänderten Anforderungen ja nicht. Was hast du dir denn überlegt, was hast du versucht?



  • @SeppJ
    Nun ich habe zunächst versucht das Problem ohne das Einfügen der Textdatei zu lösen.

    Ich hab versucht in dem bereits vorhandenen Code die Lösung miteinzubeziehen aber das hat nicht so ganz hingehauen, denn ich wusste nicht wie ich die double und string Werte einlesen und bearbeiten kann.
    Also hab ich versucht das ganze ohne Einbindung der Textdatei zulösen und hab es auch somit hingekriegt. Ich denke also das mein Ansatz richtig ist nur ich wüsste nicht wie ich das anhand der Textdatei mache.


  • Mod

    @KogoroMori21 sagte in Eingabe und Ausgabe:

    Ich hab versucht in dem bereits vorhandenen Code die Lösung miteinzubeziehen aber das hat nicht so ganz hingehauen, denn ich wusste nicht wie ich die double und string Werte einlesen und bearbeiten kann.

    Das ist doch der entscheidende Punkt! Du musst doch mehr dazu gemacht haben, als "weiß ich nicht"!



  • @SeppJ Ja aber ich komme leider nicht darauf, weil ich nicht weiß wie das geht und ich es noch nie gemacht habe. Deswegen frage ich ja hier im Forum, damit ich einmal weiß wie das richtig geht



  • @KogoroMori21 sagte in Eingabe und Ausgabe:

    Ich weiß ja wie man was bearbeitet aber ich weiß nicht wie ich es aus der Textdatei einlesen kann und ausgeben kann.

    Hier wird doch alles, was durch Whitespace getrennt ist, nach und nach eingelesen:

    @SeppJ sagte in Eingabe und Ausgabe:

    	string wort;
    	while(cin >> wort) // und zwar genau hier!
    	{
    		try
    		{
    			int i;
    			size_t num_converted;
    			i = stoi(wort, &num_converted);
    			if (num_converted == wort.size())
    				cout << showbase << hex << i << endl;
    		} catch (invalid_argument){};
    	}
    


  • Ich gebe dir mal Hilfe zur Selbsthilfe:

    Hinweis: stoi im Code von @SeppJ steht für "string to int". Siehe auch: https://en.cppreference.com/w/cpp/string/basic_string/stol

    Da könntest du mal auf die Idee kommen zu suchen, ob es etwas ähnliches auch für double gibt. Vielleicht ja "stod"? Vielleicht guckst du auch in der Doku zu stoi mal im Bereich "See also"?

    Einlesen von Strings ist ja schon erledigt - dann wandelst du eben gar nicht um. Für Strings ist häufig auch getline sinnvoll, wenn du nicht ein Wort, sondern eine ganze Zeile lesen willst.


Log in to reply