probleme beim lesen von istream



  • das folgende soll einen int von einem istream lesen

    wenn man jetzt z.B "4," eingibt, liefert er jedoch nicht 4 als ergebnis, sondern irgendeinen krempel

    bei eingaben wie "4;", "4k", ... läuft alles korrekt ..

    int readInt(std::istream& in)
    {
    	removeWhitespace(in);
    
    	char ch;
    	in.get(ch);
    
    	std::cout << ch;
    
    	// TODO
    	if (!std::isdigit(ch))
    		throw "shit";
    
    	in.putback(ch);
    	int i;
    	in >> i;
    
    	std::cout << i;
    
    	return i;
    }
    

    die ausgaben sind zur kontrolle dadrin

    der char ch liefert den korrekten char wert
    der int i ist dann aber schon komplett falsch ...

    einfach einen int einlesen geht nicht, da ich auf newline besonders reagieren will...

    PS: ich weiß nicht, obs relevant ist: ich benutze visual studio 2005 professional (msdnaa)


  • Mod

    Ich entnehme deinem Text, dass dies keine Übungsaufgabe ist, sondern dass du ein spezifisches Problem lösen willst. Beschreib mal dein Problem, denn dein Ansatz ist fast sicher falsch - iostreams setzt man eigentlich anders ein.

    Ich glaube Werner Salomon hatte hier mal ein schönes Beispiel gezeigt, wie man iostreams nach den eigenen Wünschen zurecht biegt, leider finde ich es gerade mit der Forumssuche nicht.



  • ich möchte eine liste von csv einlesen, wobei die zeilen jedoch nicht gleich lang sein müssen.

    nachtrag zu dem problem: es schein ein bug mit visual studio compiler zu sein, da, wenn ich als output release einstelle, klappt es ... mit debug aber nicht



  • Geht doch viel einfacher?!

    char c;
    int i;
    std::cin.get(c);
    if(std::isdigit(c))
       i = c - 48;
    

  • Mod

    thorondir schrieb:

    ich möchte eine liste von csv einlesen, wobei die zeilen jedoch nicht gleich lang sein müssen.

    😕 csv ist doch ziemlich gut mit den Standardmethoden lesbar. Wo ist dein Problem?

    nachtrag zu dem problem: es schein ein bug mit visual studio compiler zu sein, da, wenn ich als output release einstelle, klappt es ... mit debug aber nicht

    Merke: Wenn du denkst, dass du einen Bug in einem Compiler gefunden hast, dann hat dein Programm einen Fehler. In den Compilern stecken hunderte oder gar tausende von Mannjahren an Entwicklung und Fehlersuche. Glaubst du wirklich, dass ausgerechnet du zufällig über einen unbekannten Compilerfehler gestolpert bist?



  • Ich weiß nicht, was ich falsch machen soll, aber folgendes programm liefert bei mir folgende ausgabe (wenn ich es in debug kompiliere):

    4, <-- eingabe, komma am ende
    -858993460

    #include <iostream>
    
    int main(int, char**)
    {
    	int i;
    	std::cin >> i;
    
    	std::cout << i << "\n";
    
    }
    

    in release funktioniert es und mit auch mit allem anderen als dem komma hinter der zahl ...

    @ad acta: die zahlen sind normalerweise größer als eine ziffer ...



  • PS: nachtrag: kann auch sein, dass der bug schon behoben ist, weil mein VS ist nicht up to date - müsste ich mal machen, aber der patch der zur verfügung steht ist etwas zu groß für meine aktuelle internet anbindung



  • thorondir schrieb:

    Ich weiß nicht, was ich falsch machen soll, aber folgendes programm liefert bei mir folgende ausgabe (wenn ich es in debug kompiliere):

    4, <-- eingabe, komma am ende
    -858993460

    Ich kann mich dunkel erinnern, dass es da mal einen Fehler in einer 'frischen' VC-Version gab, wo ein folgendes ',' als 1000-Trennzeichen interpretiert wurde. Das ist aber schon ein paar Jahre her - also das kann VC2005 gewesen sein.

    thorondir schrieb:

    #include <iostream>
    
    int main(int, char**)
    {
    	int i;
    	std::cin >> i;
    
    	std::cout << i << "\n";
    }
    

    in release funktioniert es und mit auch mit allem anderen als dem komma hinter der zahl ...

    grundsätzlich solltest Du nach dem das Einlesen beendet ist, den istream nochmal auf Fehler testen, Ansonsten ist die Ausgabe von 'i' sinnlos.

    thorondir schrieb:

    wenn man jetzt z.B "4," eingibt, liefert er jedoch nicht 4 als ergebnis, sondern irgendeinen krempel

    bei eingaben wie "4;", "4k", ... läuft alles korrekt ..

    int readInt(std::istream& in)
    {
    	removeWhitespace(in);
    	
    	char ch;
    	in.get(ch);
    
    	std::cout << ch;
    
    	// TODO
    	if (!std::isdigit(ch))
    		throw "shit";
    
    	in.putback(ch);
    	int i;
    	in >> i;
    
    	std::cout << i;
    
    	return i;
    }
    

    es ist nicht selbstverständlich, dass eine std::istream putback korekt bearbeitet, also besser danach den istream auf !fail() testen.

    thorondir schrieb:

    einfach einen int einlesen geht nicht, da ich auf newline besonders reagieren will...

    deshalb kannst Du trotzdem einfach ein int lesen. Wenn Du auf Zeilenende prüfen möchte, so hilft Dir vielleicht dies weiter.

    Ansonsten beschreibe doch das Format, welches Du lesen willst. Dann kann man konkrete Hilfestellung geben.

    Gruß
    Werner



  • Danke für den Link und die tipps/hiweise bzgl testen auf fehler.

    Der Code hilft mir weiter, bzw dadurch sollte das programm deutlich einfacher werden 😉


Anmelden zum Antworten