Funkcja scanf i EOF

0

Witam
Mam napisać program, w którym wczytuję dane ze standardowego wejścia, aż do napotkania znaku końca pliku. Dobrze byłoby to zrobić za pomocą scanf

while (scanf("%s",slowo) != EOF)
	{
		number = atoi(slowo);
		printf("%s\n", slowo);

//dodatkowe zadania
........

I teraz tak wczytywanie dziala ok. Tzn mogę wczytać ciąg znaków, zamienić go na liczbę, ale nie działa prawidłowo CTRL+Z. Muszę wprowadzić kilka razy z klawiatury, zanim program wyjdzie z pętli while. Ktoś może powiedzieć dlaczego tak się dzieje i jak to naprawić.

0

scanf ("%[^\xFF]", bufor) powinno wczytać wszystko aż do końca, natomiast ogólnie jak wczytujsz coś scanfem to zwróci ci zero jak nic nie przeczyta (czyli m. in. jak będzie EOF), a więc while (scanf (format, bufor)).

0

Nie tak jest z programistą, który nie czyta dokumentacji.
https://www.cplusplus.com/reference/cstdio/scanf/
EOF jest zwracane wystąpi znak EOF przed jakąkolwiek konwersją.
Swoją drogą dziwne, że czytasz scanfem do stringa a potem konwertujesz, nie prościej od razu do inta?

0

Ale ona wcześniej porównywała z EOF i mówiła, że nie działa.

2

Ze scanfem do inta:
while(j=scanf("%d", &i)>0) printf("%d %d\n", i, j);

Ze scanfem do stringa:

#include <stdio.h>

int main(int argc, char* const argv[])
{
        int j;
        char c[15]={0};
        while(j=scanf("%14s", c)>0) printf("%s %d\n", c, j);
        return 0;
}

Z fgets bo jak czytasz stringa to prostsze od scanfa:

#include <stdio.h>

int main(int argc, char* const argv[])
{
        char c[15]={0};
        while(fgets(c, 14, stdin)) printf("%s\n", c);
        return 0;
}
0

OK dzięki za odpowiedzi. Ale pytanie jest dlaczego nie rozpoznaje prawidłowo znaku EOF.

3

Rozpoznaje. Ty po prostu nie rozumiesz co scanf zwraca.
A zwraca liczbę konwersji (generalnie). EOF zwraca tylko jeśli EOF wystąpił przed dokonaniem jakiegokolwiek przetwarzania:

Man page podaje:

On success, these functions return the number of input items successfully matched and assigned; this can be fewer than provided for, or even zero, in the event of an early matching failure.

The value EOF is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. EOF is also returned if a read error occurs, in which case the error indicator for the stream (see ferror(3)) is set, and errno is set to indicate the error.

EDIT wyprintuj j (z moich przykładów post wcześniej) po wyjściu z pętli to zrozumiesz o co mi chodzi.

0
gonskabalbinka napisał(a):

Witam

Mam napisać program, w którym wczytuję dane ze standardowego wejścia, aż do napotkania znaku końca pliku. Dobrze byłoby to zrobić za pomocą scanf

while (scanf("%s",slowo) != EOF)
	{
		number = atoi(slowo);
		printf("%s\n", slowo);

//dodatkowe zadania
........

I teraz tak wczytywanie dziala ok. Tzn mogę wczytać ciąg znaków, zamienić go na liczbę, ale nie działa prawidłowo CTRL+Z. Muszę wprowadzić kilka razy z klawiatury, zanim program wyjdzie z pętli while. Ktoś może powiedzieć dlaczego tak się dzieje i jak to naprawić.

Zamiast Ctrl+Z to może ci chodzi o Ctrl+D? Użyj tego wtedy jak wpisujesz z klawiatury, aby wysłać EOF gdy skończysz pisać; jeżeli czytasz z normalnego pliku to EOF samo będzie na końcu. Rozwiązanie powinno być takie:

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

static char slowo[4096];

int main(int argc, char *argv[])
{
    int number;
    while(scanf("%s", slowo) != EOF)
    {
        number = atoi(slowo);
        printf("%s\n", slowo);
    }
    return 0;
}

Nie wiem do czego ci służy zmienna number, ale może masz coś do dopisania w tej pętli.

EDIT:
Nie wiem jakiego systemu używasz, więc dopiszę: Ctrl+D to jest na linuxie, na windowsie zamiast tego po skończeniu wpisywania jest Ctrl+Z i Enter. Obie rzeczy muszą być wpisane w ostatniej pustej linii, czyli ostatnią linię z danymi kończysz Enterem i wpisujesz albo Ctrl+D albo Ctrl+Z i Enter.

1

TL;DR Powinno byc while(scanf("%s", slowo) == 1) (tak najlatwiej).

1 użytkowników online, w tym zalogowanych: 0, gości: 1