Fgetc (stdin)

Hi.

EOF ist nicht unbedingt immer -1.

EOF ist ein Wert der außerhalb des Wertebereichs von char liegen muss. Falls char vorzeichenbehaftet ist, z.B. den Bereich [-128, 127] abdeckt, darf EOF nicht -1 sein, da es sonst mit einem normalen Zeichen "verwechselt" werden könnte.

(siehe z.B. http://www.greenend.org.uk/rjk/tech/cfu.html#stdiochar)

Aus diesem Grund ist auch die Implementierung der dumpStdinLine falsch, da tempChar ein int sein muß damit es richtig funktioniert.

Gruß
 
Zuletzt bearbeitet:
Ich sitz grad an der gleichen Aufgabe... Wo ich das einsetzen muss weiss ich (geht übrigens auch beliebig woanders in der Schleife) aber ich versteh nicht ganz wie es funktioniert, weil ich nicht ganz verstehe was stdin heisst, weil mir gesagt wurde es wäre eine eingabe aus der tastatur aber es krieg ja offensichtlich die werte von scanf...
 
Hi

fgetc ist eigentlich nicht für die Tastatur gedacht, sondern zum Zeichenlesen aus einer Datei.
Dazu übergibt man stdin eine FILE-Variable, die die Datei repräsentiert,
aus der ausgelesen werden soll.

stdin ist ein Sonderfall von FILE:
a) Existiert es schon, muss nicht geöffnet werden usw.
b) Kommt alles mit stdin von der Tastatur statt aus einer Datei

Vllt. ist das einfacher zu verstehen, falls du fscanf kennst.
Ist praktisch scanf, bekommt aber noch eine FILE-Variable und liest aus dieser Datei aus.
C++:
int i;

//Tastatur:
scanf("%d", &i);

//Datei:
fscanf(meine_file_variable, "%d", &i);

Und wenn man statt einer Filevariable stdin nimmt:
C++:
int i;
fscanf(stdin, "%d", &i);
wird wieder von der Tastatur gelesen.
Damit wäre das gleich wie das normale scanf.

Von scanf gibts also eine Variante mit FILE und eine ohne, die immer von der Tastatur liest.
VOn fgetc gibts aber nur die Mit-FILE-Variante.
Wenn man also von der Tastatur lesen will muss man eben stdin nehmen.

Gruß
 
Danke für die antwort,

ich hatte das jetzt jetzt grade schon mit meiner Arbeitsgruppe zusammengebastelt, aber trozdem danke. was ich trozdem nicht verstehe ist wofür diese funktion überhaupt gut ist... sie liest eigentlich nur den datenstrom von der tastatur zum programm ein und mehr nicht. aber wenn man das programm ausführt bringt es trozdem etwas.
 
ja hab ich, aber die frage ist wieso das, selbst wenn es nach printf aufgerufen wird etwas an dem was ausgegeben ist verändert
 
Tuts ja gar nicht?
Das, was vorher durch printf entstanden ist, bleibt auch unverändert so.
Wenn nicht, hast du einen seltsamen Programm(ier)fehler.
Zeig mal deinen aktuellen Code.
 
Code:
#include <stdio.h>

void dumpStdinLine()
{
  char tempChar;
  do
  {
    tempChar = fgetc(stdin);
  } while ( (tempChar != EOF) && (tempChar != '\n') );
}

int main()
{
  int a1, a2, a3, b;
  while ( b != 3 )
  {
    printf("Geben Sie drei ganze Zahlen ein.\n");
    b = scanf("%d %d %d", &a1, &a2, &a3);
    printf("b == %d\n", b);
    dumpStdinLine();
  }
  return 0;
}

Das ist der aktuelle code. Wenn dumpStdinLine nicht aufgerufen wird und man z.B. einen Buchstaben eingibt anstatt einer ganzen Zahl, dann hägt der sich irgendwie auf und gibt die ganze Zeit irgend nen Dreck aus. Wenn dumpStdinLine aber aufgerufen wird, dann wird einfach nur die Schleife unterbrochen, "b == *anzahl der bis zum Buchstaben eingegebenen ganzen Zahlen*" ausgegeben und nach einer neuen Eingabe gefragt.
 
Hi.

Das liegt am Eingabepuffer.

Alles was man eingibt (egal womit stdin nun verbunden ist) landet erstmal da.

Gibt man etwas falsches z.B. bei scanf ein, kann scanf die Eingabe nicht verarbeiten und läßt den Eingabepuffer unverändert.

Ohne dumpStdinLine wird wieder printf, danach scanf aufgerufen. Da der Eingabepuffer unverändert ist, steht immer noch etwas Ungültiges drin und scanf kann die Eingabe nicht verarbeiten...

dumpStdinLine führt dazu das einfach die aktuelle Zeile aus dem Eingabepuffer entfernt wird. Es entfernt also die ungültigen Zeichen und man kann mit der nächsten Zeile weitermachen.

Übrigens sollte entweder die Variable b ordentlich initialisiert werden, oder es sollte eine do while Schleife verwendet werden.

Gruß
 

Neue Beiträge

Zurück