Ignorowanie niektórych znaków podczas wczytywania plików

0

Mam problem z wczytywaniem plików. Ogólnie chodzi o to, że w pliku znajduje się liczba, słowo i znowu liczba, następnie jest przejście do następnej linii i kolejna linijka wygląda tak samo. Muszę stworzyć funkcję, która wejdzie do pliku, w trybie do odczytu, zignoruje pierwszą liczbę, a pobierze słowo i tą kolejną liczbę.
Jak to zrobić, żeby program wiedział w którym momencie ma zacząć zapamiętywać ciąg znaków, a następnie zapamiętane znaki wpisać do zmiennej?

2

Jeśli te rzeczy są oddzielane spacją to wystarczy

fscanf(file, "%d %s %d", &ignoredNumber, charArray, &wantedNumber);
0

o ja, to tak można? :D Nieźle dzięki! :D

3
twonek napisał(a):

Jeśli te rzeczy są oddzielane spacją to wystarczy

fscanf(file, "%d %s %d", &ignoredNumber, charArray, &wantedNumber);

Lepiej użyć%*:

fscanf(file, "%*d %s %d", charArray, &wantedNumber);

Ta gwiazdka powoduje, że to co zostało dopasowane do formatu nie zostanie nigdzie zapisane.

0

Teraz mam kolejny problem

Mój program ma strukturę, składającą się z liczby i napisu (tablica charów o określonym rozmiarze)
w moim main() mam tablicę, o typie tej struktury (struktura tab[Rozmiar])
i muszę z góry użyć ustalonej funkcji (w sensie ustalone jest to co zwraca i ustalone argumenty), która zwraca wartość 0 jeżeli wszystko przebiegło w porządku, a 1 jak nie było żadnych porcji danych do pobrania- czyli mój plik w którym są umieszczone dane (bo dane mój program czerpie z pliku) nie zawiera więcej wierszy. (int rekord(FILE *wejscie, struktura *tab))

moja funkcja

int rekord(FILE *wejscie, struktura *tab)
{
	struktura pomocnicza;

	fscanf(we,"%*d %s %d", struktura.napis, &struktura.liczba);
	*tab=struktura;
	return 0;
}

Teraz tak, nie mogę zapętlić mojej funkcji... Tak, żeby pobierała cały czas nowy wiersz i zapisywała go do mojej struktury, która znajduje się w main().

for(i=0; i<Rozmiar; i++)
{
rekord(wejscie,tab[i]); // rekord(wejscie,&tab[i]); też jakoś słabo... :/
}

to nie działa, nawet takiej opcji nie ma... Co tu robić? muszę dostać w main() wartości które są zapisane w pliku, a które moja funkcja ma odebrać, nie mam pojęcia jak to zrobić...

0

Przyjrzyj się, jak nazywa się parametr w funkcji rekord, a jak wywołujesz fscanf.
Btw, słaba nazwa funkcji - wczytaj_rekord już lepiej opisuje jej zasadę działania, choć osobiście nie widzę sensu wywalania tego kodu w ogóle w osobną funkcję.

0

pisałem to na szybko.

 int rekord(FILE *wejscie, struktura *tab)
{
    struktura pomocnicza;
 
    fscanf(we,"%*d %s %d", pomocnicza.napis, &pomocnicza.liczba);
    *tab=pomocnicza;
    return 0;
}

Tak czy siak dalej nie działa, nie chodzi mi o to, żeby było ładnie, chcę żeby to działało... :/

0

Wciąż masz ten sam błąd z nazwą parametru.

0
 int rekord(FILE *wejscie, struktura *tab)
{
    struktura pomocnicza;
 
    fscanf(wejscie,"%*d %s %d", pomocnicza.napis, &pomocnicza.liczba);
    *tab=pomocnicza;
    return 0;
}

Teraz dobrze? :D

0

Wciąż wczytujesz w fscanfie trzy parametry, a przekazujesz tylko dwa wskaźniki.
Nevermind, powinno być dobrze.

2
struktura pomocnicza;
...
*tab=pomocnicza;

A po co tak?

int readFromFile(FILE* input, struktura* elem)
{
    if (fscanf(input, "%*d %s %d", elem->napis, &elem->liczba) == EOF)
        return 1;
    else
        return 0;
}
...
readFromFile(input, &tab[i]);
0

spacje tutaj: "%*d %s %d" sa opcjonalne. Powoduja ze strumienia usuwane sa biale znaki, ale nie ma to znaczenia przy wczytywaniu %s %d. Gdybys wczytywal pozniej znaki to wtedy moglbys dostac spacje/entery zamiast oczekiwanego znaku.

0
twonek napisał(a):
int readFromFile(FILE* input, struktura* elem)
{
    if (fscanf(input, "%*d %s %d", elem->napis, &elem->liczba) != EOF)
        return 1;
    else
        return 0;
}
...
readFromFile(input, &tab[i]);

Słuchajcie, przeanalizowałem problem bardziej i jak biorę sobie, jakąś zwykłą tablicę znaków i zwykłego inta, a następnie ją wywołuje przez fscanf() to wszystko działa, a jak próbuję wykorzystać moją strukturę, to nie akceptuje tego, takie coś mi wyświetla:
error C2228: left of '.napis' must have class/struct/union
error C2228: left of '.liczba' must have class/struct/union

//To nie działa
fscanf(we,"%*d %s %d", tab->napis, &tab->liczba);
printf("%s %d", tab.napis, tab.liczba);

//To działa dobrze...
fscanf(we,"%*d %s %d", czar, &daj);
printf("%s %d",czar,daj);

Umieszczony kod programu jest w main(), a nie w funkcji, po prostu testowałem. Jak nie trudno się domyślić, dalej mi nie działa ta funkcja.
Wrzucić cały kod programu? Znając życie za brzydko piszę i nie programowemu, ale kod to kod. :P

1
printf("%s %d", tab.napis, tab.liczba);

. to nie to samo co ->

0

w takim razie z 4 błędów zrobiło mi się 8. :)

A jaka jest różnica? Mógłbyś napisać?

1

bo zapewne mialo byc

tab[i].napis
0

O wybawco!

Jeszcze tylko chciałbym się dowiedzieć jaka jest różnica pomiędzy tym ->, a kropką (.). Bo rzeczywiście, gdyby nie te strzałki to by mi nie działała ta funkcja.

1

-> dokonuje dereferencji (wskaźnik->obiekt), . operuje na obiekcie.

1

w skrócie:

x->y 

to taki odpowiednik

(*x).y

czyli -> stosuje się do wyłuskania składowych z typu wskaźnikowego (iteratory też jako takie traktujemy), natoniast kropkę do wyłuskania składowych obiektu. Ale to jest chyba w każdej książce o c/c++!

0

dzięki chłopaki :)

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