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)
-
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;
-
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
-858993460Ich 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
