Kod:
if (!ptr)
{
printf("error!");
getch();
return 0;
}
else
fseek(ptr,0,0);
W powyzszym kodzie zbedna jest instrukcja else. Zastosowany przez Ciebie zapis jest nielogiczny. Jesli funkcja fopen nie zdola otworzyc pliku wowczas pod adresem wskazywanym przez ptr bedzie 0. Zatem zostanie wyswietlony komunikat i po wcisnieciu dowolnego klawisza program zostanie zakonczony. Kazda instrukcja znajdujaca sie po za blokiem if wykona sie tylko wtedy jesli funkcja fopen zwroci niezarowa wartosc! Instrukcja else zastosowana bez {} odnosi sie do najblizszej instrukcji po else czyli fseek co nie ma zadnego sensu. Moglbys zastosowac klamry i objac nimi pozostaly blok kodu ale jak juz wspomnialem jest to zbedny zabieg.
Kod:
fseek(ptr,0,0);
for(i=0;i<200;i++)
{
if(fread(&bufor,1,1,ptr))
do
tab[i]=bufor;
while(bufor!=' ');
}
Funkcja fread odczytuje jeden znak z pliku i zapisuje go do bufora. Jesli znak zostanie odczytany wskakujesz do petli do while. W buforze jest caly czas pierwszy znak czyli np. 'A'. Zapisujesz ten znak nastepnie to tablicy i sprawdzasz czy w buforze jest znak ' '. Czyli wynonujesz nieskonczona petle poniewaz w buforze caly czas masz zachowane 'A'!
Oto moja 'koslawa' wersja programu realizujacego Twoje zadania. Bardzo czesto w petli while zamiast ' ' stosuje sie EOF - znacznik konca pliku.
Kod:
#include<stdio.h>
int main(int argc, char* argv[])
{
register char c;
char *buff;
char *buff_ptr;
FILE *fptr;
buff_ptr = buff;
fptr = fopen("ala.txt", "rt");
if(!fptr)
{
fprintf(stderr, "\n fopen error!");
return 1;
}
while((c = getc(fptr)) != ' ')
*buff++ = c;
*buff = '\0';
printf("\n String: %s\n", buff_ptr);
fclose(fptr);
return 0;
}
Omowie ten fragment:
Kod:
while((c = getc(fptr)) != ' ')
*buff++ = c;
*buff = '\0';
printf("\n String: %s\n", buff_ptr);
Funkcja getc pobiera znaki i zapisuje je w buforze dopoki sa rozne od ' '. Zastosowalem tu bufor w postaci wskaznika. Mozna by wiele mowic na temat niepoprawnosci tego rozwiazania ale celem bylo wylacznie zobrazowanie operacji na wskaznikach. Zapis w postaci *buff++ oznacza, ze znak zostanie zapisany pod adres wskazywany przez *buff a nastepnie wskaznik zostanie zwiekszony dzieki czemu kolejny znak trafi pod adres_poczatkowy + 1. W przykladzie zostal uzyty jeszcze jeden wskaznik, ktorego zadaniem jest wskazywanie na na pierwszy element zapisany do bufora. Zakladajac, iz w pliku znajduje sie tekst w postaci "Ala ma kota". Zas buff wskazuje na adres 0012f000 wczytanie znaku spowoduje, iz pod adresem 0012f000 zostanie zapisana litera 'A' po czym wskaznik zostanie zwiekszony i buff bedzie wskazywal na 0012f001 itd. Gdy zostanie wczytany znak spacji buff bedzie wskazywal na adres 0012f003 mimo ze zostaly zapisane tylko 3 znaki! Niezbedne jest zakonczenie wczytanego ciagu znakow znakiem '\0' oznaczajacym koniec stringu. Wykorzystujemy fakt, ze adres zostal juz zwiekszony i zapisujemy pod nim '\0'. Dzieki temu buff_ptr wskazuje na 0012f000 czyli:
Kod:
0012f000 'A'
0012f001 'l'
0012f002 'a'
0012f003 '\0'
...
Skoro wiemy, ze ciag znakow jest zakonczony '\0' mozemy potraktowac go jeko string ASCIIZ i wyswietlic przy pomocy printf podajac wskaznik wskazujacy na pierwszy znak ciagu.
Pewnie zamiast wytlumaczyc tylko namieszalem Ci w glowie
Polecam ksiazke "Jezyk ANSI C".