Szukanie określonych słów w pliku

0

Witam.
Chciałbym napisać program (w C), który szuka w pliku określonych słów a następnie je zapisuje do pliku.//takie np kolorowanie składni
Najłatwiej (wg mnie) było by tworzyć string z wyrazów w pliku (wiadomo, że każde słowo/wyraz jest oddzielony spacją)
Następnie string(wyraz) byłby porównywany do wzorca.

Np.
Program otwiera plik i pobiera dane znak po znaku. Jeśli napotka spację (lub znak nowej linii) to z tych wszystkich znaków tworzy stringa (jako tablice) a potem porównuje ją z wzorcem. I tak aż osiągnie koniec pliku.

Domyślam się że bardziej zoptymalizowane sposoby.
//Może jest jakaś funkcja która sama pobiera wyrazy z pliku (a nie char po charze)

0
mimol napisał(a)

Chciałbym napisać program (w C), który szuka w pliku określonych słów a następnie je zapisuje do pliku.//takie np kolorowanie składni
To w końcu zapisuje czy koloruje?

0
#include <stdio.h>
#include <string.h>				
int main(){
	char syntax[]="super";
	char fword[100];			
	FILE *fp,*fp2;
	fp2=fopen("out.txt","a+");
	fp=fopen("plik.txt","a+");
	while(fscanf(fp, "%s", fword)!=EOF){
	
		if(strcmp(fword, syntax) ==0){
			fprintf (fp2, "!%s\!\n", fword);
		}else{
			fprintf (fp2, "%s\n", fword);
		}
	}	
	fclose (fp2);
	fclose (fp);
	return 0;
} 

plik.txt

asdf kot ala
namiot super rurka

Wiec output.txt bedzie wygladal tak

asdf
kot
ala
namiot
!super!
rurka

Jak wyszukać znak nowej lini?? Próbowałem /n i /0 ale nie dziala?
Chcę żeby po prostu przepisał plik.txt ale jeśli napotka wyraz (super) to wstawi go w !

0

if( char znak == '\n' )

0

hmm nie działa. Jak chcesz porównywać chara z charem bez strcmps?
Wydaje mi się że ta funkcja po prostu nie czyta białych znaków

0

Jeśli zapisujesz liniami, to liniami powinieneś czytać - funkcja fgets (choć jakiś bezpieczniejszy wariant byłby lepszy).

0
mimol napisał(a)

hmm nie działa. Jak chcesz porównywać chara z charem bez strcmps?
Wydaje mi się że ta funkcja po prostu nie czyta białych znaków

Char jest wartością liczbową taką samą jak każda inna. I z każdą inną można go porównać.

0

Używając fgets jak porównać stringi?
Co zrobić żeby zapisać !super! (dany wyraz otoczony wykrzyknikiem)?

0

A co ma wczytywanie do porównywania?
Zainteresuj się wyrażeniami regularnymi.

0

Wydaje mi się że nie potrzebuje wyrażeń regularnych po chcę porównać do zdefiniowanego słowa (w tym przypadku super)
Chciałbym żeby z takiego pliku

asda super to jest asdfg
asdf bbbb cccc 

Wyszukał słowo klucz(super) i przed i po nim dodał !.
Czyli mniej więcej tak

 asda !super! to jest asdfg
asdf bbbb cccc
0

@winerfresh, przesadziłeś z tymi wyrażeniami.
@mimol, masz tu niepełny kod, który przerabia pojedynczą linię. Resztę musisz sobie sam napisać.

char buf[] = "asda super to jest asdfg";
char* p1 = buf;

while(*p1)
{
	while(*p1 && isspace(*p1))
		putc(*p1++,fp2);

	char* p2 = p1;
	while(*p2 && !isspace(*p2))++p2;
	
	char ok =	/* tu sprawdzasz, czy ciąg z przedziału [p1,p2) jest ciągiem szukanym.*/
			/* jeśli jest, ustawiasz 'ok' wartość różną od zera */

	if(ok)putc('!',fp2);
	while(p1 < p2) putc(*p1++,fp2);
	if(ok)putc('!',fp2);
}
0

Napisałem coś takiego (oczywiście nie działa)

#include <stdio.h>
#include <string.h>		
#include <ctype.h>
int main(){
	char buf[] = "asda super to jest asdfg";
	char* p1 = buf;
	char szukane[]="super";
	char ok= 0;
	FILE *fp2;
	fp2=fopen("out.txt","a+");	
	while(*p1)
	{
		while(*p1 && isspace(*p1))
			putc(*p1++,fp2);

		char* p2 = p1;
		while(*p2 && !isspace(*p2))
			++p2;

		if(strcmp(p1, szukane) ==0){
		ok =1;        
		}					

		if(ok)putc('!',fp2);
		while(p1 < p2) putc(*p1++,fp2);
		if(ok)putc('!',fp2);
	}

	return 0;
}

Nie potrafię porównywać tego stringu czy zawiera się w drugim. Proszę o jakąś podpowiedź

0
find()
0

Zależy mi żeby program napisać w C
Nie potrafię tak tego przerobić żeby działało w C.
Zauważyłem że jeśli w całym stringu jest np "to forum jest superwypas itd" szukając stringa "super" znajdze go (chcę by szukał dokładnie super a nie słowa rozpoczynające się od super)

0

Definicję ok wewnątrz pętli dałem po coś. Po Twojej przeróbce, po znalezieniu słowa, pozostałe wyrazy, bez względu na to, czy są szukane czy nie, będą oznaczone wykrzyknikami.

Masz tu funkcję porównującą, bo widzę, że są problemy:

char equal_substr(const char* p1,const char* p2,const char* s)
{
	char c;
	while(p1 < p2 && *s && (c = *p1++ - *s++) == 0);
	return c == 0 && p1 == p2 && *s == 0;
} 
0

Naskrobałem coś takiego.
http://wklej.org/id/422336/
Jednak nie rozumiem jakie zadanie ma spełniać c zmienna w funkcji porównującej.

Definicję ok wewnątrz pętli dałem po coś. Po Twojej przeróbce, po znalezieniu słowa, pozostałe wyrazy, bez względu na to, czy są szukane czy nie, będą oznaczone wykrzyknikami.

if(equal_substr(p1,p2, )){
ok =1;        
}                           

Wydaje mi się że ok przyjmie wartość jeden tylko jeśli warunek zostanie spełniony. Oczywiście bardzo możliwe że się mylę. Widzę że funkcja zwraca 3 wartości.. Nie wiem jak sprawdzić czy waruenk jest spełniony jak funkcja zwraca tylko chary.

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