Burschi1620
24/7 Santa Claus
|
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... 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
|
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
|
Wenn die Wörter durch Leerzeichen getrennt sind, dann kannst du z.B. so etwas in der Art verwenden: #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
|
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
|
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
|
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
|
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
|
|
Burschi1620
24/7 Santa Claus
|
@ 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
|
was aber das schlimmste ist; er funktioniert nicht^^ hmm? ich hab jetzt einfach mal copy/paste vom ersten gemacht und dieses getestet: $ 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
|
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: #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
|
und wo ist das problem? (abgesehen davon, dass dort auch innerhalb der wörter gesucht wird)
|
Burschi1620
24/7 Santa Claus
|
@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
...
|
freiwillig mit C? in java würd so ein StringTokenizer würd das leben doch viel viel leichter machen...
|
Burschi1620
24/7 Santa Claus
|
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*).
|