Fehlerhafte Stringübergabe

Hi.

Erstmal solltest du vorher das Projekt bereinigen bevor du etwas hochlädst. Ich weiß nicht wie virenverseucht dein Rechner ist und werd mit Sicherheit kein Programm ausführen was ich mal eben schnell irgendwo runtergeladen hab... ;)

Dein Problem ist: du liest nichts ein. Wenn du start() aufrufst fragst du einen int ab. Der Benutzer gibt etwas ein und drückt die Eingabetaste.

Somit befindet sich ein \n Zeichen im Eingabepuffer welches du sogleich mit dem getline() Aufruf einliest (d.h. filename = "", daran hängst du noch ein .ini dran, ergibt ".ini").

Du mußt also die Zeile entweder komplett einlesen (was evtl. schöner wäre, da eine Zeile wie "34asdfksd" eben keine korrekte Eingabe ist), oder du ignorierst das bisher eingegebene mit cin.sync() bevor du die nächste Eingabe ausliest.

Übrigens, es ist keine gute Idee Umlaute in Dateinamen zu verwenden. Dadurch funktioniert der Debugger nicht.

Und warum machst du denn diese komischen " \b" Ausgaben?

Gruß

PS: Die ganzen Warnungsmeldungen scheinen dich auch nicht zu irritieren. Ein '.' ist kein gültiges Zeichen für einen Makrobezeichner. Und du hast überall vergessen cstdlib einzubinden (dein Code konnte nicht kompiliert werden).
 
Zuletzt bearbeitet:
Guten Abend Deepthroat,

zu erst einmal vielen Dank für deine Zeit und Bemühungen! Ich finde deine Kritik angemessen und möchte sie mir zu Herzen nehmen, weshalb ich einige Fragen habe, um für das nächste Mal besser/sauberer zu arbeiten:

Erstmal solltest du vorher das Projekt bereinigen bevor du etwas hochlädst. Ich weiß nicht wie virenverseucht dein Rechner ist und werd mit Sicherheit kein Programm ausführen was ich mal eben schnell irgendwo runtergeladen hab... ;)
Wie meinst du das genau? In dem Ordner befinden sich doch nur code-relevante Dateien.

Du mußt also die Zeile entweder komplett einlesen (was evtl. schöner wäre, da eine Zeile wie "34asdfksd" eben keine korrekte Eingabe ist), oder du ignorierst das bisher eingegebene mit cin.sync() bevor du die nächste Eingabe ausliest.
Danke für die anschauliche Erklärung. Mir ist das Problem jetzt bewusst. Allerdings verstehe ich nicht so ganz, wie und wo ich die Zeile nun komplett einlesen sollte.

Übrigens, es ist keine gute Idee Umlaute in Dateinamen zu verwenden. Dadurch funktioniert der Debugger nicht.
Werde ich für die Zukunft berücksichtigen.

Und warum machst du denn diese komischen " \b" Ausgaben?
Diese Variante habe ich hier her: C++ Umlaute
PS: Die ganzen Warnungsmeldungen scheinen dich auch nicht zu irritieren. Ein '.' ist kein gültiges Zeichen für einen Makrobezeichner. Und du hast überall vergessen cstdlib einzubinden (dein Code konnte nicht kompiliert werden).
Komisch, ich kann das alles kompilieren und bekomme keine Warnungen. Ich benutze MinGW als Compiler und als IDE Code::Blocks.

Trotzdem Danke noch einmal für deine Hilfe. Dies gilt selbstverständlich auch für die anderen!
 
Guten Abend Deepthroat,

zu erst einmal vielen Dank für deine Zeit und Bemühungen! Ich finde deine Kritik angemessen und möchte sie mir zu Herzen nehmen, weshalb ich einige Fragen habe, um für das nächste Mal besser/sauberer zu arbeiten:


Wie meinst du das genau? In dem Ordner befinden sich doch nur code-relevante Dateien.
Du sagtest doch selber das da eine .exe mit drin ist. Die außerdem noch 760KB groß ist, was eine Verschwendung von Zeit un Resourcen ist, da die .exe sowieso keiner ausführt.
Danke für die anschauliche Erklärung. Mir ist das Problem jetzt bewusst. Allerdings verstehe ich nicht so ganz, wie und wo ich die Zeile nun komplett einlesen sollte.
Statt soetwas wie
C++:
int x;
if (cin >> x) {
  ...
}
Liest du halt die Zeile komplett mit getline ein, verarbeitest sie dann mit den stringstreams und schaust ob nach dem Einlesen der Zahl auch wirklich nichts mehr kommt.

Diese Variante habe ich hier her: C++ Umlaute
Ich habe bemerkt das der GCC merkwürdigerweise \xNNNN Escapesequenzen verarbeitet. Ich würde einfach die okt. Sequenzen verwenden. (\xe1 => \341)
Komisch, ich kann das alles kompilieren und bekomme keine Warnungen. Ich benutze MinGW als Compiler und als IDE Code::Blocks.
Code:
C:\temp\gdgz_\Wuerfel\draw_equals.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_equals.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\draw_raute.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_raute.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\draw_stars.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_stars.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\draw_tilde.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_tilde.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\filename.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\filename.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\intro.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\intro.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\draw_equals.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_equals.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\layout_c.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\layout_c.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\layout_m.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\layout_m.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\layout_m.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\layout_m.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\layout_c.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\layout_c.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\start.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\start.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\start_c.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\start_c.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\filename.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\filename.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\process.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\process.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\process_c.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\process_c.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\intro.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\intro.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\size_ms.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\size_ms.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\process_ml.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\process_ml.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\process_cl.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\process_cl.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\process.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\process.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\draw_raute.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_raute.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\draw_stars.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_stars.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\draw_tilde.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\draw_tilde.h|2|Warnung: Whitespace hinter Makroname fehlt|
C:\temp\gdgz_\Wuerfel\process_c.h|1|Warnung: mehrere Token am Ende der Direktive #ifndef|
C:\temp\gdgz_\Wuerfel\process_c.h|2|Warnung: Whitespace hinter Makroname fehlt|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 0 warnings ===|
Code:
g++ --version
g++ (GCC) 4.4.0
Gruß
 
Guten Abend,

ich möchte gerne Deepthroats Ansatz befolgen und Konstrukte wie:
Code:
int x;
if (cin >> x) {
  ...
}

in getline einlesen. Allerdings funktioniert das bei mir nicht wirklich:
Meine start.cpp
Code:
#include <iostream>
#include <limits>
#include <string>
#include "start.h"
using namespace std;

unsigned long int start()
{
    bool check=false;
    unsigned long int temp=0;
    do
    {
    cout<<"Wie oft soll geworfen werden: ";
    //cin>>temp;
    getline(cin,temp);
    if(!cin)
    {
        cerr<<"Falsche Eingabe\a\n";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(),'\n');
        }
    else
    {
        check=true;
    }
    }while(check==false);
return temp;

}

gibt folgende Fehlermeldung aus:
rfel\start.cpp|15|error: no matching function for call to `getline(std::istream&, long unsigned int&)'|

Ich habe das auch noch nie vorher so gemacht, wie Deepthroat es vorgeschlagen hat, sodass ich leider nicht wirklich voran komme.
 
Hi.
ich möchte gerne Deepthroats Ansatz befolgen und Konstrukte wie:
Code:
int x;
if (cin >> x) {
  ...
}

in getline einlesen. Allerdings funktioniert das bei mir nicht wirklich:
getline funktioniert nur mit Strings.
C++:
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.
    }
  }
}
]
Gruß
 
Zuletzt bearbeitet:
Guten Tag Deepthroat,

Danke für deine Antwort in so früher Stunde ;) .

Ich habe deinen Code ausprobiert, allerdings lässt es sich nicht kompilieren:

Code:
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{

string line;
int x;
cout<<"Enter something: "<<endl;
cin>>line;
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.
  }
 }

    return 0;
}

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).

Zusätzlich habe ich auch einmal deine zweite Variante mit cin.sync(); ausprobiert. Ist es richtig, dass man dann nach der Eingabe des Dateinamens 2x Enter drücken muss?

Danke im Voraus!
 
Zurück