Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » prob mit getline

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.03.2006, 22:59 Uhr
Karldin Shinowa
Professional Noob


Hier mein Code und mein problem: an den mit !!!! gekennzeichneten stellen scheint er getline zu überspringen......


C++:
#include<fstream>
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

int DateiLesen();
int DateiSchreiben();

int main()
{
   char auswahl;
   bool beenden=false;

   while(beenden==false)
   {
      system("cls");
      
      cout<<"Datei auslesen[1]"<<endl
          <<"in Datei schreiben[2]"<<endl;
      cin>>auswahl;
    
      switch(auswahl)
      {
         case '1':
         {
            system("cls");
            DateiLesen();
            beenden=true;
            break;
         }
  
        case '2':
        {
           system("cls");
           DateiSchreiben();
           beenden=true;
           break;
        }
  
        default:
        {
           beenden=false;
           break;
        }
      }

      getchar();
   }
}


int DateiLesen()
{
   char dateiname[50];
   char ch;
   cout<<"Dateiname(max 50 characters):";
   cin.getline(dateiname,50);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
   ifstream Datei;
   Datei.open(dateiname,ios::in|ios::nocreate);
   if(!Datei)
   {
      cout<<"Invalid input";
      return -1;
      
   }
  
   while(!Datei.eof())
   {
      Datei.get(ch);
      cout<<ch;
   }
  
   Datei.close();
  
}


int DateiSchreiben()
{
   char dateiname[50];
   char text[100];
  
   bool beenden=false;
   char auswahl;
  
   cout<<"Dateiname(max 50 characters):";
   cin>>dateiname;
  
   ofstream Datei;
   //testopening begin
   Datei.open(dateiname,ios::out);
   if(!Datei)
   {
      cout<<"Invalid input";
      return -1;
      
   }
   Datei.close();
   //testopen end
  
   while(beenden==false)
   {
   system("cls");
   cout<<"Text anhängen?"<<endl
       <<"JA[1]"<<endl
       <<"NEIN[2]"<<endl;
   cin>>auswahl;
    
      switch(auswahl)
      {
         case '1':
         {
            Datei.open(dateiname,ios::out|ios::app|ios::nocreate);
            beenden=true;
            break;
         }
  
         case '2':
         {
            Datei.open(dateiname,ios::out|ios::trunc|ios::nocreate);
            beenden=true;
            break;
         }
  
         default:
         {
            beenden=false;
            break;
         }
      }
   }

  
  
   cout<<"Text(max 100 character):";
   cin.getline(text,100);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
   char ch;
   int i=0;
   while(true)
   {
      ch=text[i];
      if(ch=='\0') break;
      Datei.put(ch);
      i++;
   }
  
   Datei.close();
  
}


--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.03.2006, 00:01 Uhr
~Gast100
Gast


Hi;
mir fällt da fflush() ein.

also:

C++:
int DateiSchreiben()
{
   char dateiname[50];
   char text[100];
.
.
.

   cout<<"Text(max 100 character):";
fflush(stdin);
   cin.getline(text,100);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
   char ch;
   int i=0;
   while(true)
   {
      ch=text[i];
      if(ch=='\0') break;
      Datei.put(ch);
      i++;
   }
  
   Datei.close();
  
}



fflush() leert den Puffer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.03.2006, 09:59 Uhr
Karldin Shinowa
Professional Noob


danke funktioniert jetzt. aber wieso muss ich fflush(stdin) anwenden??? und was is das stdin??
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.03.2006, 10:01 Uhr
virtual
Sexiest Bit alive
(Operator)


fflush(stdin) ist
1. Plattformabhängig, geht nur unter Windows
2. Es wird was ganz anderes geflush als erforderlich (stdin und cin sind zwar an die gleiche Datei gebunden, aber benutzen unterschiedliche Buffer)

Dennoch ist der Ansatz nicht ganz falsch: die Eingabe wird im wesentlichen übersprungen, weil Du in main ein ZEichen einliest. Das einlesen eines Zeichens ist aber nur möglich, wenn Du anschließend <ENTER> drückst. Dh Nach der Eingabe ist noch <ENTER> im Buffer. Die ignore methode von cin sollte abhilfe schaffen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.03.2006, 11:15 Uhr
Karldin Shinowa
Professional Noob


eine veränderung der eingabe dass kein enter eingegeben werden muss funktioniert:

C++:
while(true)
{
    if(kbhit())
    {
        auswahl=getch();
        break;
    }
}



und so sollte es auch funktionieren oder( auswahl ist diesmal ein string):

C++:
.
.
.
cin>>auswahl;
switch(auswahl[0])
      {
         case '1':
         {
            Datei.open(dateiname,ios::out|ios::app|ios::nocreate);
            beenden=true;
            break;
         }
  
         case '2':
         {
            Datei.open(dateiname,ios::out|ios::trunc|ios::nocreate);
            beenden=true;
            break;
         }
  
         default:
         {
            beenden=false;
            break;
         }
      }



ich weis dass das zweite unsinnig wäre aber hab ich das jetzt richtig kapiert oder?: wenn ich alles in nen string tue bleibt nix im buffer?
thx

Ps:cin.ignore() löscht den puffer oder?
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 05.03.2006 um 11:16 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.03.2006, 15:52 Uhr
~Gast100
Gast


Hi,
Es fuktioniert natürlich auch mit ignore():


C++:
int DateiSchreiben()
{
   char dateiname[50];
   char text[100];
.
.
.

   cout<<"Text(max 100 character):";
cin.ignore();
   cin.getline(text,100);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
   char ch;
   int i=0;
   while(true)
   {
      ch=text[i];
      if(ch=='\0') break;
      Datei.put(ch);
      i++;
   }
  
   Datei.close();
  
}



bin das fflush() aus C gewohnt in verbindung mit scanf().
Das fflush() Plattformabhängig ist ist mir auch bekannt, das cin und stdin verschiedene Buffer benutzen wuste ich nicht also wieder was gelernt. Danke!

Karldin Shinowa: stdin steht für Standard-Input

zu ignore():
istream &ignore(streamsize num=1, int delim=EOF)
Die Funktion ignore() kann dazu benutzt werden Zeichen aus einem Eingabe-Stream zu lesen und zu verwerfen. Die Funktion liest und verwirft Zeichen so lange bis num Zeichen verworfen worden sind oder bis sie auf das durch delim festgelegte Zeichen trifft.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: