Jak działa fscanf?

0

To pewnie dość głupio brzmiąca prośba, ale czy ktoś mógłby mi wytłumaczyć jak działa funkcja fscanf? Chodzi mi o to w jaki sposób ona czyta plik. Wiem, że zaczyna czytać od miejsca, w którym jest umiejscowiony znacznik... a gdzie kończy? Jeżeli mam taki warunek: if(fscanf(wskaznik,"%s",znak) == EOF) i za znak podam w nim literę (lub słowo), która znajduje się w odczytywanym pliku, to fscanf skończy czytać na tej literze/słowie, czy też może (jak gdzieś słyszałam) będzie niezależnie od wszystkiego czytał wszystko do pierwszego, białego znaku? Albo do samego końca pliku? A może sczyta tylko wskazaną przeze mnie literę/słowo, ale sam znacznik przesunie do końca linijki lub końca pliku?

Jestem początkująca w te klocki, także przepraszam za naiwne pytania, ale nie rozumiem co ta funkcja tak dokładnie robi.

4

Dla %s:

Any number of non-whitespace characters, stopping at the first whitespace

https://cplusplus.com/reference/cstdio/fscanf/

Wystarczy przeczytać oficjalną dokumentacje.

Taki sposób wczytywania nie jest bezpieczny, lepiej robić np. tak %10s lub fscanf_s opisanego tutaj: https://stackoverflow.com/questions/3112869/fscanf-fscanf-s-difference-in-behaviour

3

Dla uzupełnienia dodam, że warto jednak sprawdzić błędy. W tym przypadku możesz mieć aż 3 przypadki:

  • <0 – błąd, można wypisać opis błędu funkcją perror()
  • =0 – koniec pliku
  • =1 – sukces

Dla uproszczenia można po prostu zrobić if(fscanf(…) <= 0), jeśli nie chcesz się rozdrabniać jaki błąd wystąpił….

3
elwis napisał(a):

Dla uzupełnienia dodam, że warto jednak sprawdzić błędy. W tym przypadku możesz mieć aż 3 przypadki:

  • <0 – błąd, można wypisać opis błędu funkcją perror()
  • =0 – koniec pliku
  • =1 – sukces

Dla uproszczenia można po prostu zrobić if(fscanf(…) <= 0), jeśli nie chcesz się rozdrabniać jaki błąd wystąpił….

Nie do końca prawda.
wartość >= 0 wylicza ile parametrów zostało wczytanych.
Np to:

fscanf(file, "Expected header");

zwróci 0 w przypadku sukcesu.
a to:

int a, b, c;
fscanf(file, "%d %d %d", &a, &b, &c);

Może zwrócić wartości od 0 do 3 w przypadku powodzenia.

Live demo:

#include <stdio.h>

int main()
{
    int a, b, c;
    int result;

    while((result = scanf("%d %d %d", &a, &b, &c)) >= 0) {
        scanf("%*[^\n] ");
        printf("result = %d a = %d b = %d c = %d\n", result, a, b, c);
        a = -1;
        b = -1;
        c = -1;
    }
    printf("End result = %d a = %d b = %d c = %d\n", result, a, b, c);
}
0

Jak działa fscanf jest opisane w dokumentacji.

Gdzie skończy zależy od argumentów. fscanf nie szuka tylko czyta to co wskazujemy.
Bez większej ilości kodu trudno powiedzieć co się stanie.

Ja to widzę tak: przeczytaj z wskaznik (który powinien wskazywać na plik tj. FILE*) pierwsze słowo (%s tj. ciąg nie zawierający białych znaków) pomijając poprzedzające białe znaki i zapisz tam gdzie wskazuje znak. Skończy czytać tuż za tym słowem. Jeśli w pliku nie ma nic więcej wykonaj to co jest tam dalej w kodzie.

znak musi być w stanie pomieścić to co będziemy czytać (plus \0). W przeciwnym wypadku program się posypie lub efekt bedzie nieoczekiwany. Bezpieczniej jest z wspomnianym wcześniej %{liczba znaków}s lub fscanf_s.

Dodatkowo jeśli w pliku jeszcze coś będzie ale nie będzie to tym co chcemy przeczytać (tj. %s) ten if sie nie wykona bo fscanf zwróci 0 a nie EOF.

0

Pewnie siedzisz na windowsie więc wpisz w google 'man fscanf' znajdzie manuale linucha, lepsze to niż nic. Najlepiej używać posixowego ( https://pubs.opengroup.org/onlinepubs/9699919799/ ) imho. Ewentualnie windows też ma swoje ale ja bym se je darował.

Pozdrawiam !

Na normalnyn systemie masz to w konsoli jak człowiek.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.