Mam takie oto zadanie:
Zadanie polega na wyszukiwaniu slow podanych przez użytkownika w tekscie, znajdujacym sie we
wskazanym pliku *.txt.
dzialania programu wyglada tak:
- uzytkownik podaje dostep do pliku (sciezke dostepu) + nazwe pliku. program otwiera plik wtrybie do odczytu, jezeli nie ma takiego pliku podaje odpowiedni komunikat i czeka na wprowadzenie poprawnej nazwy;
- po poprawnym dostepie do pliku, program pyta o szukany tekst, w tym przypadku moze tobyc:
a. pojedyncze slowo
b. ciag sloww obu przypadakch maksymalna liczba wprowadzanych znakow nie wieksza niz 100 - po wprowadzeniu szukanego slowa/slow nastepuje jego wyszukanie w pliku, odpowiedzia programu jest:
a. numer linii, w ktorej sie pierwszy znaleziony tekst
b. wszystkie wystapienia tekstu - wypisana zostaje tablica, zawierajac numery linii,
c. wypisywany jest numer linii z tekstem z zapytaniem czy szukac dalej, jesli tak szukanie zaczyna sie od miejsca poprzedniego znalezienia szukanego tekstu. - wyniki pracy programu zapisywane sa rowniez w pliku wyjsciowym - nazwe podaje uzytkownik.
Mój problem pojawia się, gdy w linijce pliku txt znajduję się więcej niż jeden szukany wyraz. Program wyświetla wtedy numery linii, w których nie zawsze występują słowa.
Kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void zapis(char *temp,FILE *fp1, char znak)
{
int j=0;
do
{
znak=fgetc(fp1); //kopiujemy wyraz do bufora tymczasowego
temp[j]=znak;
j++;
}while(znak!='\n');
}
int main()
{
FILE *fp1,*fp2;
char src[100];
char dst[100];
char slowo[100];
char temp[500];
int i=0;
int wiersze=0;
int znak;
int j=0;
printf("Podaj sciezke do pliku (plik bez polskich znakow, ostatnia linia zakonczona enterem): \n");
gets(src);
///////////////////////////////////////////////////////////////
while ((fp1=fopen(src,"r"))==NULL)
{
printf("Blad otwarcia pliku! Wpisz sciezke ponownie.\n");
gets(src);
}
///////////////////////////////////////////////////////////////
printf("Podaj slowo/wyraz do wyszukania w pliku: \n");
gets(slowo);
///////////////////LICZNIK WIERSZY////////////////////////////
do
{
znak=fgetc(fp1);
if (znak=='\n') wiersze++;
} while(znak != EOF);
printf("Ilosc wierszy: %d",wiersze);
//////////////////////////////////////////////////////////////
fseek(fp1,0,0);
char tablica[wiersze][500]; //tu bedzie wszystko
long offset;
for(i=0;i<wiersze;i++)
{
for(j=1;j<500;j++)
{
tablica[i][j]=0;
}
}
for(i=0;i<wiersze;i++)
{
zapis(temp,fp1,znak);
offset=ftell(fp1);
j=0;
tablica[i][0]=i+1; //wpisujemy numery wierszy
for(j=1;j<500;j++)
{
tablica[i][j]=temp[j-1]; //wpisujemy do tablicy
}
}
for(i=0;i<wiersze;i++) //wyswietlanie
{
printf("\n%d ",tablica[i][0]);
for(j=1;j<500;j++)
{
if(tablica[i][j]=='\n')
break;
printf(" %c",tablica[i][j]);
}
}
////////////////SZUKANIE//////////////////
char *poz;
int found=0;
for(i=0;i<wiersze;i++)
{
poz=strstr(tablica[i],slowo);
if(poz!=NULL)
{
found=i+1;
break;
}
}
if (found == 0)
printf("\n Nie znaleziono podanego slowa/slow.\n\n");
else
printf("\nPierwszy napotkany wiersz z podanym slowem/slowami: %d\n\n",found);
///////////////////////////////////////////
/////////////WYPISYWANIE WSZYSTKICH//////////////////////////
int a=0;
printf("Numery wszystkich linii z podanym slowem/slowami.\n");
printf("*************************************************\n");
for(i=0;i<wiersze;i++)
{
poz=strstr(tablica[i],slowo);
printf("\n test: i=%d, poz=%p",i+1,poz);
if(poz!=NULL )
{
printf("%d\t",i+1);
}
poz=0;
}
printf("\n");
////////////////////////////////////////////////////////////
int help=0;
char wybor;
for (i=0;i<wiersze;i++)
{
poz=strstr(tablica[i],slowo);
if(poz!=NULL)
{
printf("\n%d.\t",tablica[i][0]);
for(j=1;j<500;j++)
{
if(tablica[i][j]=='\n')
break;
printf("%c",tablica[i][j]);
}
printf("\n");
}
// else help++;
}
system("Pause");
return 0;
}
Dodatkowo zamieszczam treść testowanego pliku txt (probelm pojawia się np. przy słowie "slowo")
Zadanie polega na wyszukiwaniu slow slow podanych przez uzytkownika w tekscie, znajdujacym sie
we wskazanym nazwe pliku *.txt.
dzialania programu wyglada tak:
- uzytkownik podaje nazwe dostep do pliku (sciezke dostepu) + nazwe pliku. program otwiera plik w
trybie slow do odczytu, slow jezeli nazwe nazwe nie ma slow nazwe takiego pliku podaje odpowiedni komunikat i czeka na
wprowadzenie poprawnej nazwy; - po poprawnym nazwe dostepie do pliku, program pyta o szukany tekst, w tym przypadku moze to
byc:
a. pojedyncze slowo slow bla bla
b. ciag slow bla bla
w obu przypadakch maksymalna liczba wprowadzanych slow znakow nie slow wieksza niz 100 - po wprowadzeniu szukanego slow slowa/slow nastepuje jego wyszukanie w pliku, odpowiedzia
programu jest:
a. numer linii, w slow ktorej slow slow sie pierwszy slow znaleziony tekst
b. wszystkie wystapienia tekstu - wypisana zostaje tablica, zawierajac numery linii,
c. wypisywany slow jest nazwe numer linii z tekstem z zapytaniem nazwe slow czy szukac dalej, jesli tak szukanie
zaczyna sie od miejsca slow poprzedniego znalezienia szukanego tekstu. - wyniki pracy programu zapisywane slow sa rowniez w pliku wyjsciowym - nazwe podaje
uzytkownik.