• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

cin.sync()

Hi Jungs,


ich wollte unter Linux mit Suse 10.1 ein Programm schreiben. Mit Hilfe von C++ als Kommadnozeilenprogramm.

Dabei wollte ich die einfache Texteingabe über eine schleife laufen lassen, allerdings habe ich Probleme den Eingabepuffer zu leeren. Bei mehr als Zehn Zeicheneingaben und der Ausführung des nächsten cin spring das App direkt weiter und der Rest vom Eingabepuffer wird ausgegeben.

Ich hoffe ich habe mich verstänldich ausgedrückt und werde ncoh einmal grob den Quellcode hinlegen:

Code:
       //Initialize Variaibles 
	char cInput[10];

	while(1)
	{
		cout << "\n>";

		cin.getline(cInput, 10);

		//Puffer leeren 
		cin.sync();
		cin.clear();

		//Einagbe verwalten 
		handleInput(cInput);
	};

Dort seht Ihr es. Bei mehr als 10 Zeichen spring das ab bei der nächsten cin.getline direkt weiter.


Vielen Danks chon einmal im vorraus.

Grüße Jenna
 
Wozu .sync()? Das hilft dir beim flushen genauso wenig wie fsync().
.clear() macht auch was anderes denke ich - zu letzterem hält sich meine STL-Referenz bedeckt. Grundsätzlich gilt immer: stdin voll auslesen.
 

abgdf

Guru
Hallo,

ist mir echt ein Rätsel, wieso liest er denn beim nächsten Durchgang einfach weiter ??? :? :

Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char c;
while (1)
{
c=getchar();
fflush(stdin);
printf("%c\n",c);
}
}

Gruß
 

abgdf

Guru
Hallo Jenna,

ich weiß zwar immer noch nicht, warum das so ist, aber ich habe (in Anlehnung an Kernighan/Ritchie, S. 28 ) eine Funktion geschrieben, die sich daran anpaßt und zumindest (irgendwie) funktioniert 8) :

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;

void mygetline(char *s,int lim);

int main(void)
{
char cInput[10];
while (1)
{
cout << ("\n> "); 
mygetline(cInput,9);
cout << cInput;
}
}

void mygetline(char s[],int lim)
{
char *b;
b=(char *) malloc(200);
int i=0;
char c;
while ((c=getchar())!=EOF && c != '\n')
{
*b=c;
b++;
i++;
}
b=b-i+lim;
*b='\0';
b=b-lim;
strcpy(s,b);
free(b);
}

Ist vielleicht etwas schwer zu verstehen, C/C++ ist ja nicht einfach.
Das Array s[] wird hier nicht als Kopie, sondern über einen Zeiger übergeben und kann daher unmittelbar von der Funktion geändert werden.
Ansonsten fiel mir auf: Ein Array cInput[10] hat nur Werte von 0-9, so daß cInput[9] der letzte Wert ist.

In Python und Perl geht sowas ja sooo viel schneller und leichter ... :p

Viele Grüße
 
Oben