Fehlerhafte Stringübergabe

Es kommt immer: error: `input' was not declared in this scope. Und markiert die Zeile mit if (input.eof()). Von der Logik her ist der Fehler korrekt, denn der Gültigkeitsbereich des Objekt Input endet ja in der Zeile else vor if(input).
Aber einfach nur aus dem Grund weil ich eine öffnende geschweifte Klammer hinter dem if vergessen habe. Man sieht doch das da eine Klammer fehlt...

Ich werd's mal berichtigen.

Gruß
 
Guten Morgen,

entschuldige bitte Deepthroat, aber ich komme mit deinem Code leider nicht zurecht:

test.cpp
Code:
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
string line;
int x=0;
cout<<"Enter something: ";
cin>>line;
if (getline(cin, line)) {
  istringstream input(line);

  if (input >> x) {
    if (input.peek() == EOF) {
      cout<<"\nyour input was1: "<<input;//ok
     } else {
      cout<<"\nyour input was2: "<<input;// Fehlerhafte Eingabe
     }
  } else {
    if (input.eof()) {
      cout<<"\nyour input was3: "<<input;// Eingabe zu kurz
    } else if (!input.bad()) {
     cout<<"\nyour input was4: "<<input; // fail(). falsches Format
    } else {
      cout<<"\nyour input was5: "<<input;// schwerer Fehler.
    }
  }
}


    return 0;
}

Es kommt immer "your input was3:", also eine zu kurze Eingabe laut deinen Kommentaren. Egal was ich ausgebe (input, line oder x), es wird immer 0 angezeigt.
 
Wieso hast du denn meinen Code nicht übernommen, bzw. wer hat irgendwas davon gesagt cin >> line auszuführen?

Gruß


Guten Tag Deepthroat,

wie meinst du das genau? Dein geschriebener Code:

Code:
string line;
int x;
 
if (getline(cin, line)) {
  istringstream input(line);
 
  if (input >> x) {
    if (input.peek() == EOF) {
      // OK...
     } else {
      // Fehlerhafte Eingabe
     }
  } else {
    if (input.eof()) {
      // Eingabe zu kurz
    } else if (!input.bad()) {
      // fail(). falsches Format
    } else {
      // schwerer Fehler.
    }
  }
}

Ich muss doch Anweisungen in diesen Code schreiben, daher habe ich zum Test deinen Code genommen und mit cin>>line; geschaut, wie sich das Testprogramm verhält. Deiner Aussage nach zu urteilen, brauche ich den Code einfach nur in die Funktion start() einfügen :confused:

Noch einmal zum Verständnis:
Mein Problem liegt ja darin, dass nach der Funktion start(); (in der der Benutzer festlegen kann, wie oft gewürfelt oder geworfen werden soll) ein \n im Eingabepuffer liegt. Dadurch sind keine Dateinamen mit Leerzeichen mehr möglich.
Dein Ansatz beruht ja darauf, dass ich bei der Funktion start(); schon alles in getline einlese. Wie gesagt verstehe ich nicht so recht, wie ich deinen Code jetzt vernünftig implementiere.

Trotzdem Danke ich dir rechtherzlich für deine Zeit, Mühe und Geduld!
 
Hallo Deepthroat,

nachdem ich das cin>>line; entfernt hatte, lief mein Testprogramm. Im Nachhinein wird mir auch deutlich, warum die Zeile sinnlos war, da ja (getline(cin, line) die Eingabe einlesen soll und nicht cin :)

Leider ist dies auch die einzig erfreuliche Nachricht. Ich bin jetzt beim Implementieren in der start.cpp
Code:
#include <iostream>
#include <limits>
#include <string>
#include <sstring>
#include "start.h"
using namespace std;

unsigned long int start()
{
    bool check=false;
    unsigned long int temp=0; //Anzahl der Würfe
    string line;
    do
    {
if (getline(cin, line)) {
  istringstream input(line);

  if (input >> temp) {
    if (input.peek() == EOF) {
      check=true;// OK...
     } else {
      // Fehlerhafte Eingabe
     }
  } else {
    if (input.eof()) {
      // Eingabe zu kurz
    } else if (!input.bad()) {
      // fail(). falsches Format
    } else {
      // schwerer Fehler.
    }
  }
}
    }while(check==false);
return temp;

}

Leider gibt der Compiler folgende Fehlermeldung aus:
rfel\start.cpp|16|error: variable `std::istringstream input' has initializer but incomplete type|

Wie immer Danke im Voraus!
 
Hi.

Meinstest du evtl. sstream statt sstring?

Gruß

Hallo Deepthroat,

ja, ich meinte natürlich sstream :-(

Es lässt sich zwar kompilieren, aber der Fehler mit dem Dateinamen bleibt weiterhin bestehen. Sobald ich im Dateinamen einen Leerschritt setze, kommt die Fehlermeldung aus Intro(). Wieso benutzt das Programm eigentlich diese Fehlermeldung? Die Funktion dient eigentlich nur zur 1. Auswahl :confused:
 
Vielleicht hast du bei switch das break vergessen? Diese kleinen Fehler nerven sehr, dass weiß ich aus eigener Erfahrung :-)
 
Hallo Deepthroat,

ja, ich meinte natürlich sstream :-(

Es lässt sich zwar kompilieren, aber der Fehler mit dem Dateinamen bleibt weiterhin bestehen. Sobald ich im Dateinamen einen Leerschritt setze, kommt die Fehlermeldung aus Intro(). Wieso benutzt das Programm eigentlich diese Fehlermeldung? Die Funktion dient eigentlich nur zur 1. Auswahl :confused:
Kann ich nicht nachvollziehen. Allerdings hast du natürlich das gleiche Problem in intro wie in start und start_c.

Du solltest versuchen nicht soviel Code zu duplizieren (oder wirst du pro Codezeile bezahlt? :suspekt:).

Und du solltest deine Funktionen so benennen das man auch weiß was dahintersteckt (was macht jetzt z.B. start im Unterschied zu start_c?).

Gruß
 
Zurück