"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[C]Ganze Wörter aus Textfile auslesen

Burschi1620 09.07.2006 - 13:39 2150 22
Posts

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
Ich würde gerne bestimmte wörter aus einem textfile auslesen. Gibts dafür vielleicht schon ausprogrammierte funktionen? Mit C kann man ja leider nur zeichenweise das Textfile auslesen.

Hier is mein versuch das wort BEGIN auszulesen - aber es is leider fehlerhaft...
Code:
datei=fopen("C:\\psinfo.log", "r");
     //zdatei=fopen(zfilename, "w");
     do   //for(z=0; z<1000000; z++)
     {
          x=fgetc(datei);
          
          //fputc(x,zdatei);
          if(x=='B')
          {
                    y=1;
                    puff[0]=x;                 
          }  
          
          if(y==1 && x=='E')
          {
                  y=2;
                  puff[1]=x;       
          }
          if(y==2 && x=='G')
          {
                  y=3;
                  puff[2]=x;
                                    
          }                        
         if(y==3 && x=='I')
          {
                  y=4; 
                  puff[3]=x;     
          }
         if(y==4 && x=='N')
          {
                  y=5;
                  puff[4]=x;
                  i++;       
          }           
        //printf("%c", x);       
     }while(x!=EOF);

Danke schonmal ;)

Corow

Here to stay
Avatar
Registered: Sep 2005
Location: Austria
Posts: 1214
Meine Programmierzeit ist zwar schon etwas länger her, aber das is ja extrem umständlich programmiert, von der Tatsache dass man jedesmal wenn man nach nem anderen Wort suchen will, den Code umschreiben muss.
Versuch mal das ganze in ner for-Schleife zu lösen indem du y als Index der variabel puff verwendest. dann könntest du die Länge des Wortes nämlich variabel machen.

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Wenn die Wörter durch Leerzeichen getrennt sind, dann kannst du z.B. so etwas in der Art verwenden:
Code:
#include <stdio.h>
#include <string.h>

int find_word(FILE *f, char *word_to_find) {
	char buffer[512];
	while (fscanf(f, "%511s", buffer) > 0) {
		if (!strcmp(buffer, word_to_find)) {
			return 1;
		}
	}
	return 0;
}

int main() {
	FILE *f = fopen("test.txt","r");
	if (find_word(f, "BEGIN")) {
		printf("Found!");
	}

	fclose(f);
	return 0;
}

Wenn keine Leerzeichen dazwischen sind: Puffer einlesen und beispielsweise mit strstr suchen.

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Zitat von gue
Wenn keine Leerzeichen dazwischen sind: Puffer einlesen und beispielsweise mit strstr suchen.
Warum? Was würde passieren, wenn man "texttexttext Wort1 Wort2 texttexttext" mit strstr nach "Wort1 Wort2" durchsucht?

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Zitat von jives
Warum? Was würde passieren, wenn man "texttexttext Wort1 Wort2 texttexttext" mit strstr nach "Wort1 Wort2" durchsucht?
Das hat nichts damit zu tun aber wenn Leerzeichen dazwischen sind, dann kann man mit fscanf den Stream nach Wörtern abscannen, wenn der Text z.B. "1212414BEGINInformation" ist, dann findet man mit der von mir geposteten Funktion das BEGIN nicht raus.

Die Variante mit strstr ist etwas komplizierter, weil man beim Einlesen des Puffers überlappend einlesen muss, deshalb hab ich es hier nicht gepostet.

pong

Addicted
Avatar
Registered: Oct 2001
Location: Wien (ned im Kra..
Posts: 414
eine - vielleicht - blöde Frage, wieso liest du den Fileinhalt nicht in ein Array und suchst dir dann nach deinen Kriterien raus, was du brauchst?

pong

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
Zitat von pong
eine - vielleicht - blöde Frage, wieso liest du den Fileinhalt nicht in ein Array und suchst dir dann nach deinen Kriterien raus, was du brauchst?

pong
also ich wüsste jetzt nicht wie ich das einfacher anstellen könnte. Abgesehen davon wäre das dann ein array mit 1 Million zeichen *g*

@Corow, wenn ich dich richtig verstanden hab geht nicht weil er würde dann nach einem B suchen und dann irgendwann ein E finden und dann irgendwann ein G finden.
Es gibt keine gewissen kriterien größe länge geschwindigkeit des programmes - das sollte kein problem sein, könnte ja auch zum spaß i=i+1 schreiben ;)


@gue, ich werd den code mal morgen versuchen nur irgendwie hab ich das gefühl er läuft auf pong's methode raus *g*

Luzandro

OC Addicted
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
@ gue
also ich hab den code mal versucht und er funktioniert ja eigentlich - nur dass er immer nur das aller erste Wort findet - in meinem file gibt es viel mehr BEGIN's (und ENDE's und lauter solche wörter :( )
Ich hab versucht den code abzuändern dass er irgendwie weitersucht, aber habs leider nicht geschafft - hättest du einen vorschlag?

@strstr methode: geht net das erkennt nämlich auch nur das aller erste BEGIN :(

@Luzandro, danke der link ist sehr informativ und man kann bestimmt viel lernen (hab mich etwas durchgeblättert und mal auf die schnelle strukturen gelernt). Nur leider ist der code für mich etwas schwerer zu verstehen (strukturen zb) was aber das schlimmste ist; er funktioniert nicht^^.
Das programm schließt sich gleich nach dem ausführen, ein getch(); am schluss hilft auch net.

Luzandro

OC Addicted
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708
Zitat von Burschi1620
was aber das schlimmste ist; er funktioniert nicht^^

hmm? ich hab jetzt einfach mal copy/paste vom ersten gemacht und dieses getestet:

Code:
$ echo "esr erBEGINdsf eraer
> sareas ewrera BEGIN sdresr" > test
$ ./bruteforce BEGIN test

Datei "test":
Pos.   6,  in Zeile 1
Pos.  14,  in Zeile 2
Suchergebnisse in "test": 2
---------------------------------------

schaut für mich eigentl. genau nach dem aus, was du suchst

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Burschi: Wär interessant, was du machen willst. Laut dem Code, den du da gepostet hast, willst du zählen, wie oft ein Wort, z.B. BEGIN, vorkommt. Weil ich sowieso grad mit einem Gipsfuß an den Computer gefesselt bin (:() hab ich dir meinen Code mal so angepasst:
Code:
#include <stdio.h>
#include <string.h>

int find_word(FILE *f, char *word_to_find) {
	char buffer[512];
	while (fscanf(f, "%511s", buffer) > 0) {
		if (!strcmp(buffer, word_to_find)) {
			return 1;
		}
	}
	return 0;
}

void occurrences(FILE *f, char *s) {
	int i = 0;
	fseek(f, 0L, SEEK_SET);
	while (find_word(f, s)) {
		i++;
	}
	printf("Found %d occurrence%sof %s\n", i, i != 1 ? "s ": " ", s);
}

int main() {
	FILE *f = fopen("test.txt", "r");

	occurrences(f, "BEGIN");
	occurrences(f, "END");

	fclose(f);
	return 0;
}

Die Funktion occurrences(FILE *f, char *s) zählt die Vorkommen eines Wortes s in einem Stream f und gibt das dann auch gleich aus.

Luzandro: Die von dir gegoogelte Lösung funktioniert leider nur unter bestimmten Voraussetzungen.

Luzandro

OC Addicted
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708
und wo ist das problem? (abgesehen davon, dass dort auch innerhalb der wörter gesucht wird)

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
@luzandro ich werd mal den code mit einem anderen compiler versuchen, vielleicht gehts ja dann.



Ich muss aus einer Textdatei daten rausziehen und diese dann in tabellenform in ein anderes textfile schreiben.
Die textdatei umfasst etwa 300 PCs; jeder einzelne PC wird durch ein "BEGIN" und ein "ENDE" begrenzt. am wichtigsten sind die "patches", vor allem müssen die in der tabelle eingetragen werden.
Sieht etwa so aus:
****** PC NAME BEGIN ******

Blaa fuer PC NAME ist gestartet worden
Verbinde to PC NAME...
System information for \\PC NAME:
Uptime: 325446345 Tage 34343 Minuten....
Pocessors:
PATCHES Installed
XXXXXXX
XXXXXXX
XXXXXXX
XXXXXXX
XXXXXXX
XXXXXXX
XXXXXXX
XXXXXXX

****** PC NAME ENDE ******

Ich hab mir halt überlegt ich kann wenn ich erstmal nach den wörtern suchen kann mich weiterhanteln zu den andern daten.

Danke für deinen code, würdest du mir bitte das fscanf und das fseek erklären? Ich hab mich zwar um die definitionen von den befehlen umgesehen nur ich verstehs leider nicht :(

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3279
freiwillig mit C? in java würd so ein StringTokenizer würd das leben doch viel viel leichter machen...

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
Zitat von DKCH
freiwillig mit C? in java würd so ein StringTokenizer würd das leben doch viel viel leichter machen...
hätteste genauere infos? Java kann ich auch ein bisschen (für objekte reichts gerade noch *g*).
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz