PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei nach Muster durchsuchen in C



suse
20-07-2003, 16:14
Hallo,

ich weiss leider nicht mehr weiter........brauche eure hilfe!
Ich will eine Datei öffnen, diese sieht wie folgt aus;



1 2 3 4 5 6
12 14 1 3 101 56
usw...


Diese Datei beinhaltet viele Zeilen die mit jweils 6 Zahlen!
Ich will die Datei öffnen und nach einer bestimmten Zahlen kombination durchsuchen wie z.B. 1 2 3 4 5 6. Dabei ist es sehr wichtig das die Rheinfolge der zahlen unwichtig ist. Also ob ich 1 2 3 4 5 6 oder 2 4 6 1 5 3 eintippe muss er die Zahlenkombination finden.... Ich weiss leider nicht wie ich das bewerkstelligen soll....
Hier der Anfang meines Quellcodes:



#include <stdio.h>
#include <string.h>

main()
{
char dateiname[20];// = "zahlen";
FILE *datei;

printf("\nName der Datei:");
scanf("%s",&dateiname);

datei = fopen(dateiname,"rt");
if (datei == NULL)
{
printf("\nFehler beim oeffnen der Datei %s!\n\n",dateiname);
}
else
{
printf("\nDatei %s geoeffnet!\n\n",dateiname);
}


Ich wäre für jede hilfe dankbar!

gruss
suse

quinte17
21-07-2003, 06:31
man könnte jede zeile für sich sortieren, um somit der reihenfolge egal zu sein... aber du kanst auch jedes element mit jedem deines musters vergleichen... (was du eh machen musst, und hast somit eigentlich recht wenig aufwand...


while(LESE_ZEILE)
{
for(i=0;i<ANZAHL_AN_ZAHLEN_PRO_ZEILE;i++)
{
x=0; // x auf 0 setzen, prüfer obein element NICHT gefunden wurde
for(j=0;j<ANZAHL_AN_ZAHLEN_DEINES_MUSTERS;j++)
{
if(MATCH) // falls element in der liste vorhanden x auf 1 setzen
{
x=1;
}
}
if(x==0) // falls x 0 ist mit der nächsten zeile fotfahren...
{
break;
}
}
}


im schlechtesten fall hast du eine durchlaufdauer von N²
mfg

edit: bitte verwende int arrays und keinen string der die zahlen beinhaltet...

suse
21-07-2003, 10:44
Danke erstmal für die schnelle hilfe, werde es Probieren..
Falls Probleme auftauchen werde ich mich melden, das kann ich doch..., oder!


Habe das Problem schon mit einem Shell Script gelöst will es aber unbedingt in C fertig stellen.

gruss
suse

suse
21-07-2003, 14:20
Ich habe mir jetzt den Code mal genauer angeschaut....und da ist mir einiges unklar.
Ich will also 6 Zahlen von der Tastatur einlesen und diese dann in der Datei finden. Das heißt das diese 6 Zahlen in einer Zeile zu finden sein (und dann noch ausgegeben werden) sollen und dies kann ich leider nicht an deinen Lösungsforschlag erkennen, sorry...(Liegt wahrscheinlich an mir)
Kannst du mal deinen Code so anpassen das er sich mit diesen Code versteht.... oder einfach mir die richtig zeigen.....

Wäre dir dankbar....
Hier mein Code:


#include <stdio.h>
#include <string.h>

main()
{
int zeichen, zahl_1, zahl_2, zahl_3, zahl_4, zahl_5, zahl_6;
char dateiname[20];// = "zahlen";
FILE *datei;

printf("\nName der Datei:");
scanf("%s",&dateiname);

printf("Bitte 6 Zahlen eingeben!\n");
printf("Zahl 1:");
scanf("%d",&zahl_1);

printf("Zahl 2:");
scanf("%d",&zahl_2);

printf("Zahl 3:");
scanf("%d",&zahl_3);

printf("Zahl 4:");
scanf("%d",&zahl_4);

printf("Zahl 5:");
scanf("%d",&zahl_5);

printf("Zahl 6:");
scanf("%d",&zahl_6);

datei = fopen(dateiname,"rt");
if (datei == NULL)
{
printf("\nFehler beim oeffnen der Datei %s!\n\n",dateiname);
}
else
{
printf("\nDatei %s geoeffnet!\n\n",dateiname);
}

}


gruss
suse

quinte17
21-07-2003, 15:12
#include <stdio.h>
#include <string.h>

main()
{
int zeichen, i_zahl[6];
int i_array[6], i=0, j=0, x=0;
char dateiname[20];// = "zahlen";
FILE *datei;

printf("\nName der Datei:");
scanf("%s",&dateiname);

printf("Bitte 6 Zahlen eingeben!\n");
for(i=0;i<6;i++)
{
printf("Zahl %d:",i+1);
scanf("%d",&i_zahl[i]);
}

datei = fopen(dateiname,"rt");
if (datei == NULL)
{
printf("\nFehler beim oeffnen der Datei %s!\n\n",dateiname);
}
else
{
printf("\nDatei %s geoeffnet!\n\n",dateiname);
while((fscanf(datai,"%d %d %d %d %d %d",&i_array[0],&i_array[1],&i_array[2],&i_array[3],&i_array[4],&i_array[5])) != EOF)
{
for(i=0;i<6;i++)
{
x=0;
for(j=0;j<6;j++)
{
if(i_array[j] == i_zahl[i])
{
x=1;
}
}
if(x==0)
{
break;
}
}
if(x==1)
{
printf("%d %d %d %d %d %d\n",i_array[0],i_array[1],i_array[2],i_array[3],i_array[4],i_array[5]);
}
}
}

}



vielliecht hab ich ein paar klammern vergessen... aber sollte funzen... *gG* wenn nicht schreib bitte fehlermeldung (ich habs noch nicht getestet)

was hier ein wenig verheerend ist, ist dass auch 2x3 zahlen über 2 zeilen oder ähnliches funzen, weil fscanf leerzeichen wie auch \n ignoriert...

mfg

SeeksTheMoon
21-07-2003, 15:25
man kann in C auch mit regulären Ausdrücken programmieren, aber weil ich das noch nie gemacht habe, kann ich da jetzt nicht mehr zu sagen.

suse
21-07-2003, 15:39
Das sieht sehr gut aus .... Danke werde sofort Probieren....

gruss
suse

suse
21-07-2003, 16:14
Es funktioniert wunderbar.... danke nochmal...
Ein Problem noch... erfindet jetzt alle Zahlen -> das heißt wenn ich 13 eintippe spuckt er mir auch 1 , 12, 14, 15, 16, 17, 18, 19 das soll er aber nicht er soll exakt nur die Zahl auspucken die ich ihm vorgebe...
Hättest du vielleicht da noch eine Idee!
Habe den Code folgender massen geändert:



main()
{
int zeichen, zahl[6], zahlen[6], i, j, x;
char dateiname[20];// = "zahlen";
FILE *datei;

printf("\nName der Datei:");
scanf("%s",&dateiname);

printf("Bitte 6 Zahlen eingeben!\n");
for(i=0;i<6;i++)
{
printf("Zahl %d:",i+1);
scanf("%d",&zahl[i]);
}

datei = fopen(dateiname,"rt");
if (datei == NULL)
{
printf("\nFehler beim oeffnen der Datei %s!\n\n",dateiname);
}
else
{
printf("\nDatei %s geoeffnet!\n\n",dateiname);
while((fscanf(datei,"%d %d %d %d %d %d",&zahlen[0],&zahlen[1],&zahlen[2],&zahlen[3],&zahlen[4],&zahlen[5])) != EO
{
for(i=0;i<6;i++)
{
x=0;
for(j=0;j<49;j++) // Soll nur bis 49 Zahlen gehen
{
if(zahlen[j] == zahl[i])
{
x=1;
}
}
}
if(x==0)
{
break;
}
if(x==1)
{
printf("%d %d %d %d %d %d\n",zahlen[0],zahlen[1],zahlen[2],zahlen[3],zahlen[4],zahlen[5]);
}
}
}

}

Ich hoffe das du dafür auch eine Lösung hast!

gruss
suse

quinte17
21-07-2003, 17:34
was willst du genau????
und das mit der forschleife einfach auf 49 ändern ist schon ein wenig schwach... (weil ja nur 6 elemente in deinem array drin sind und nicht 49)

kannst du mir mal 2-3 zeilen geben, die in deiner beispieldatei sind, und sagen was er ausgibt, und was er ausgeben soll????

wieviel hast du schon mit C gemacht?

und warum hast du den code eigentlich so stark abgeändert???
anders war er ein wenig effizienter

mfg

edit: ich verstehe es nicht.... so wie der code jetzt aussieht, ist es zufall welche zeile er ausgibt und welche nicht hängt halt von deinem letzten vergleich ab ob da dann in x zufällig 1 drin steht oder nicht.... und uneffizienter ist er auch geworden.... (ok mein beispiel hatte 1-3 bugs drinnen, aber das ist nur durch tippfehler bedingt, und dass ich des einfach so hingeschrieben hab, ohne zu testen...

suse
21-07-2003, 17:42
So ...
das ist in der Datei drin:

1 2 3 4 5 6
12 13 14 15 16 17
1 2 7 8 9 10

und es geht so weiter....

Und wenn ich nach denn folgenden Zahlen suche 12 15 17 13 14 16 gibt er mir alle aus.

Ich hoffe das klärt jetzt die Lage, oder?

gruss
suse

quinte17
21-07-2003, 17:51
also deine lage ist nur die, dass du des mit den klammer vertauscht hast, bei mir funzt der obige code (bis auf 1nen einzigen rechtschreibfehler "datai" anstatt "datei") per cut and paste ohne probs, und ich sehe nur die gesuchten zeilen... ich poste dir denn code gerne nochmal:


#include <stdio.h>
#include <string.h>

main()
{
int zeichen, i_zahl[6];
int i_array[6], i=0, j=0, x=0;
char dateiname[20];// = "zahlen";
FILE *datei;

printf("\nName der Datei:");
scanf("%s",&dateiname);

printf("Bitte 6 Zahlen eingeben!\n");
for(i=0;i<6;i++)
{
printf("Zahl %d:",i+1);
scanf("%d",&i_zahl[i]);
}

datei = fopen(dateiname,"rt");
if (datei == NULL)
{
printf("\nFehler beim oeffnen der Datei %s!\n\n",dateiname);
}
else
{
printf("\nDatei %s geoeffnet!\n\n",dateiname);
while((fscanf(datei,"%d %d %d %d %d %d",&i_array[0],&i_array[1],&i_array[2],&i_array[3],&i_array[4],&i_array[5])) != EOF)
{
for(i=0;i<6;i++)
{
x=0;
for(j=0;j<6;j++)
{
if(i_array[j] == i_zahl[i])
{
x=1;
}
}
if(x==0)
{
break;
}
}
if(x==1)
{
printf("%d %d %d %d %d %d\n" ,i_array[0],i_array[1],i_array[2],i_array[3],i_array[4],i_array[5]);
}
}
}
}


mfg

suse
21-07-2003, 18:09
An welcher stelle habe ich denn die Klammern falsch gesetzt?
Jetzt verstehe ich die folgende meldung nicht die mein Compiler liefert:



test.c: In function `main':
test.c:48: `i_arr' undeclared (first use in this function)
test.c:48: (Each undeclared identifier is reported only once
test.c:48: for each function it appears in.)
test.c:48: parse error before `ay'


Denn Code habe ich jetzt so wie du ihn mir vorgelegt hast...

gruss
suse

Silver
21-07-2003, 19:16
beim letzten printf() ist eine neue-zeile, die musst du entfernen!

quinte17
21-07-2003, 19:26
if(x==0)
{
break;
}


diesen codeschnippsel hattest du eins zuweit raus! damit hast du die while abgebrochen, nicht aber die äußere der beiden for schleifen... somit wird dein code uneffizient, und basiert auf zufall

mfg