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?
Jeśli te rzeczy są oddzielane spacją to wystarczy
fscanf(file, "%d %s %d", &ignoredNumber, charArray, &wantedNumber);
o ja, to tak można? :D Nieźle dzięki! :D
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.
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ć...
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ę.
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... :/
Wciąż masz ten sam błąd z nazwą parametru.
int rekord(FILE *wejscie, struktura *tab)
{
struktura pomocnicza;
fscanf(wejscie,"%*d %s %d", pomocnicza.napis, &pomocnicza.liczba);
*tab=pomocnicza;
return 0;
}
Teraz dobrze? :D
Wciąż wczytujesz w fscanf
ie trzy parametry, a przekazujesz tylko dwa wskaźniki.
Nevermind, powinno być dobrze.
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]);
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.
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
printf("%s %d", tab.napis, tab.liczba);
.
to nie to samo co ->
w takim razie z 4 błędów zrobiło mi się 8. :)
A jaka jest różnica? Mógłbyś napisać?
bo zapewne mialo byc
tab[i].napis
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.
->
dokonuje dereferencji (wskaźnik->obiekt), .
operuje na obiekcie.
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++!
dzięki chłopaki :)