Zum Inhalt springen

fgets funktion


HubbeldiBUBB

Empfohlene Beiträge

ich brauch mal wieder hilfe von euch! :mod:

ich möchte mein stdin mit der fgets funktion einlesen und erst wenn nichts eingegeben wird EOF machen bzw. halt auch wenn der buffer voll ist

char *fgets(&inputBuffer[0], 256, stdin)

char InputBuffer[256]

char *cptr

dann cptr = fgets(.....)

if (cptr == NULL)

hier dann das olle zählprogramm starten

Link zu diesem Kommentar
Auf anderen Seiten teilen

Tjo so in der Art ist aber nicht das Selbe...

und wie Klotzkopp schon sagt kann mit deiner Problembeschreibung niemand etwas anfangen. Du hast weder gezeigt was genau du gemacht hast noch was genau das Problem ist. Wenn du also Hilfe willst musst du dich entweder selbst mit C vertrut machen um den Fehler zu finden oder dein Problem genauer beschreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

#include <stdio.h>

main()

{

char *cptr;

char buff[256];

int zeichen;

int anz_zeichen, i;

/* lokale Variablen initialisieren */

anz_zeichen = 0;

i = 0;

cptr = fgets(&buff[0], 256, stdin);

if (cptr !=NULL) {

while ((zeichen = getchar()) != EOF) {

++i;

}

}

printf("i = <%d>", i);

printf ("\nAnzahl Zeichen = <%d> \n", i);

}

So jetzt hab ich nur noch das Problem, dass er mir die Zeichen erst ab der Zweiten Zeile einliest, er soll aber schon bei der ertsen anfangen (logisch). Ich glaub das hängt mit dem array zusammen ich muss dem doch sagen, dass er bei 0 anfängt?! Das problem ist aber -> wie !

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm irgendwie verstehe ich das Programm nicht so ganz.

du liest einen String vom stdin ein und wenn dabei kein Fehler aufritt dann liest du solange ein Zeichen wieder vom stdin ein bis getchar() EOF zurückgibt?

Erklär nochmal genau was das Programm machen soll.

und das hier:

cptr = fgets(&buff[0], 256, stdin);

kannnst du so einfacher haben:

cptr = fgets(buff, 256, stdin);

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm irgendwie verstehe ich das Programm nicht so ganz.

du liest einen String vom stdin ein und wenn dabei kein Fehler aufritt dann liest du solange ein Zeichen wieder vom stdin ein bis getchar() EOF zurückgibt?

Erklär nochmal genau was das Programm machen soll.

und das hier:

cptr = fgets(&buff[0], 256, stdin);

kannnst du so einfacher haben:

cptr = fgets(buff, 256, stdin);

also ich möchte alle zeichen zählen bis ein EOF kommt! hast es glaube schon richtig verstanden, okok das mit dem cptr = fgets(buff, 256, stdin); hat ich auch vorher da stehen habs eben nur geändert weil ich am ausprobieren bin!.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was verstehst du denn unter EOF?

Du willst also wissen wie lang der String ist den du mit fgets() eingelesen hast oder willst du nach der Stringeingabe zählen wieviele Zeichen vom Benutzer bis zu einer leerem Eingabe eingegeben werden (wenn ja wozu dann der String?)?

ich will die eingegebenen zeichen solange lesen bis ein EOF kommt sprich im UNIX z.B. ein Strg D ich könnte es auch so machen, dass ein EOF kommt wenn ich Enter drücke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah gut, damit kommen wir der Sache doch schon näher :)

Ich kann das leider bei mir nicht nachvollziehen, da bei mir unter Windows kein EOF zurückkommt wenn ich Strg+D drücke.

Ok und dein Problem ist jetzt wenn du den String eingibst und danach z.B. ein a und dann ein b eingibst das er erst das b zählt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah gut, damit kommen wir der Sache doch schon näher :)

Ich kann das leider bei mir nicht nachvollziehen, da bei mir unter Windows kein EOF zurückkommt wenn ich Strg+D drücke.

Ok und dein Problem ist jetzt wenn du den String eingibst und danach z.B. ein a und dann ein b eingibst das er erst das b zählt?

pass uff das sieht volgendermaßen aus:

konsole:

ich starte mein proggi:

proggi CR

.........

123

so er zählt jetzt erst in der zweiten zeile obwohl er die punkte auch als zeichen lesen soll!!!!!!! er ignoriert quasi die erste zeile nach dem proggi start, ich weiß nich wo dran es liegt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Achso. Ist doch logisch das er das nicht macht. Du ließt doch erst den String mit fgets() ein (in deinem Beispiel die Punkte). Da du die EIngabe des Strings mit Enter beendest springt er in die 2te Zeile und dann kommt deine Schleife die ab dann die Eingegebenen Zeichen zählt.

Also entweder lässt du die Stringeingabe weg oder du rechnest die Länge des Strings auf deine Zählvariable.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Achso. Ist doch logisch das er das nicht macht. Du ließt doch erst den String mit fgets() ein (in deinem Beispiel die Punkte). Da du die EIngabe des Strings mit Enter beendest springt er in die 2te Zeile und dann kommt deine Schleife die ab dann die Eingegebenen Zeichen zählt.

Also entweder lässt du die Stringeingabe weg oder du rechnest die Länge des Strings auf deine Zählvariable.

ääääm Joa da müsst ich nur wissen wir ich die länge des strings auf die zählvariable rechne :(

jetzt ist es so, dass er die gesamte eingabe pro zeile als ein zeichen sieht und nicht alle zählt!

Link zu diesem Kommentar
Auf anderen Seiten teilen

#include <stdio.h>


char datnam[40] = "daten.txt";

char datnam2[40] = "daten2.txt";


int main()

{

        FILE * datei;

        FILE * datei2;

        char zeile[256];


        datei = fopen( datnam, "r");

        datei2 = fopen( datnam2, "w" );

        if( datei == 0 )

        {

                printf("\nTja, diese Datei gibt es nicht!\n");

                return;

        }

        while( ! feof(datei) )

        {

                printf("%s", zeile);

                fgets( zeile, 255, datei );

                fprintf(datei2, "%s", zeile);

        }

        fclose( datei );

        fclose( datei2 );

}

äääm hier hab ich volgendes problem: er kopiert mir die letzte zeile der ersten datei, also er schreib sie mir in die zweite doppelt rein! alle anderen stimmen alo als beispiel:

TEXT TEXT TEXT ZEILE 1

TEXT TEXT TEXT ZEILE 2

TEXT TEXT TEXT ZEILE 3

TEXT TEXT TEXT ZEILE 4

TEXT TEXT TEXT ZEILE 5

TEXT TEXT TEXT ZEILE 6

TEXT TEXT TEXT ZEILE 7

TEXT TEXT TEXT ZEILE 8

TEXT TEXT TEXT ZEILE 9

TEXT TEXT TEXT ZEILE 10

TEXT TEXT TEXT ZEILE 10

die bildschirmausgabe zeigt mir aber alles korrekt an!!! nur in die datei schreibt er dann die letzte doppelt

Edit (Klotzkopp): Codetags hinzugefügt

Link zu diesem Kommentar
Auf anderen Seiten teilen

die bildschirmausgabe zeigt mir aber alles korrekt an!!!
Das sieht nur so aus. Du gibt machst schon eine Bildschirmausgabe, bevor du die erste Zeile gelesen hast. Dass dabei kein Müll ausgegeben wird, ist nur Zufall.

Das Problem ist, dass du feof zum falschen Zeitpunkt prüfst. Du musst das zwischen dem fgets und fprintf machen. Denn feof liefert erst dann Wahr, wenn fgets schon einmal fehlgeschlagen ist. Du prüfst das aber erst, nachdem du schon eine ungültige Zeile in die Datei geschrieben hast. Da steht halt noch das vom letzten Einlesen drin.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das sieht nur so aus. Du gibt machst schon eine Bildschirmausgabe, bevor du die erste Zeile gelesen hast. Dass dabei kein Müll ausgegeben wird, ist nur Zufall.

Das Problem ist, dass du feof zum falschen Zeitpunkt prüfst. Du musst das zwischen dem fgets und fprintf machen. Denn feof liefert erst dann Wahr, wenn fgets schon einmal fehlgeschlagen ist. Du prüfst das aber erst, nachdem du schon eine ungültige Zeile in die Datei geschrieben hast. Da steht halt noch das vom letzten Einlesen drin.

oki ich habs jetzt so gemacht:

while( ! feof(datei) )

        {

                printf("%s", zeile);

                fprintf(datei2, "%s", zeile);

                fgets( zeile, 255, datei );

        }

jetzt geht es auch, thx

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...