dublikate ausfiltern

Heinzi1991

Erfahrenes Mitglied
Also bei meinem Programm mit der Playlist bin ich wieder einmal auf ein Problem gestoßen!;-)

Also ich will natürlich wenn ich eine größere Playlist einlese, alle Dublikate herausschreiben mit einem Befehl!

Ich will wenn man title, artist, genre eingibt, das alle title, artists und genre von diesem struct

Code:
typedef struct song
{
	char tag[4];
	char title[31];
	char artist[31];
	char album[31];
	char year[5];
	char comment[31];
	int genre;
	struct song *next;
}PLAYLIST;

durchschaut, und mir die anzahl angibt wie oft ich diese doppelt habe!

es besteht keine case sensentive, oder ich setzte vor einem "suchbefehl" ein !, dann muss auf Großschreibung geachtet werden!

hab eig einen plan, weiß aber nicht wie ich den ausführen kann bzw ob es eigentlich funktioniert!

Also mein plan:
er schaut was der benutzer also ich eingegeben hat und schaut, dann schaue ich mit strstr(eingabe, <struct char's> ob dieser in der eingabe vorkommt!
dann will ich das er den string aus dem struct (beispiel von titel) in einen buffer speichert und die weiteren suchbefehle auch in einen buffer speichert! dann nach dem er die komplette playlist durch hat, soll er die buffers vergleichen und mir dann am schluss

<title>/<artist> (<anzahl>) ausgeben!

Wäre happy wenn jemand helfen kann!
 
Hallo,
also wenn ich dich richtig verstehe, dann sind zwei structs gleich, wenn (Groß/Klein erstmal egal) title, artist und genre mit dem jeweils angegebenen übereinstimmt?
Wenn ja einfach über alle Einträge iterieren jedesmal mit strcmp die strings vergleichen und ggf. abbrechen oder am Ende +1 rechnen.
Zwischen der Groß- und Kleinschreibung kannst du unterscheiden wenn du tolower() (klein) oder nichts nutzt, bevor du vergleichst. Gegebenenfalls musst du noch auf führende oder hängende Leerzeichen testen.

Grüße,
Jennesta
 
also ich lese die letzten 128 bytes von einem lied ein und spalte es dann mit memcpy in das struct hinein! und dieses wird erweitert! aber wie soll ich am besten einen code schreiben der mir alle structs (bei 100 lieder = 100 structs) alle suchkriterien durchsucht? ich bin zur zeit voll überfordert mit dieser funktion!

bin gerade noch auf eine schwierigkeit gekommen! man muss ja alle lieder vergleichen!

kann man eig dynamische structs vergleichen! weil wenn ein struct gleich ist wie ein andere, ist ja viel einfacher oder?
 
Zuletzt bearbeitet:
kann man eig dynamische structs vergleichen! weil wenn ein struct gleich ist wie ein andere, ist ja viel einfacher oder?
Ja.
C:
if(memcmp(&struct1, &struct2, 128) == 0) //Wenn die structs gleich sind.

Schleifen sagen dir was?

C:
for(int i = 0;i<sizeofarray;i++)
{
    for(int j = 0;j<sizeofarray;j++)
    {
        if(j == i) continue; //Gleicher Index sollte nicht geprüft werden...
        //vergleiche arr[j] mit arr[i]
    }
}

Gruss
cwriter
 
Ok ja ich kenne schleifen; jetzt hab ich nur zwei fragen:

Wie komme ich auf struct2?
Und wie groß ist sizeofarray? Bzw woher bekomm ich diese variable?
 
also ich will mit einem aufruf zum beispiel: title, artist, genre, all diese drei dinge miteinander vergleichen!

der code für das einspeichern schaut so aus:
Code:
	while(fgets(name_m3u, 1024, file_m3u) != NULL)
	{
		if(*name_m3u != '#') 
			{
				char *file_name1 = name_m3u;
				int strlength = strlen(file_name1);
				file_name1[strlength-1] = '\0';
                
                //printf("%s\n", name_m3u);//hilfestellung
                
                FILE *file_mp3 = fopen(file_name1, "rb"); 
              
                fseek(file_mp3, -128, SEEK_END);
            
                fread(meta, 1, 128, file_mp3);
                   
                PLAYLIST *ptrv;
                
                if(first == NULL)
                {
                    first = (PLAYLIST*) malloc(sizeof(PLAYLIST));
                    memcpy(p.tag, meta, 3);
                    memcpy(p.title, meta+3, 30);
                    memcpy(p.artist, meta+33, 30);
                    memcpy(p.album, meta+63, 30);
                    memcpy(p.year, meta+93, 4);
                    memcpy(p.comment, meta+97, 30);
                    
                    first -> next = NULL;
                }
                
                else
                {
                    ptrv = first;
                    while(ptrv == first)
                        
                    ptrv = (PLAYLIST *) malloc(sizeof(PLAYLIST));
                    memcpy(p.tag, meta, 3);
                    memcpy(p.title, meta+3, 30);
                    memcpy(p.artist, meta+33, 30);
                    memcpy(p.album, meta+63, 30);
                    memcpy(p.year, meta+93, 4);
                    memcpy(p.comment, meta+97, 30);
                    
                    ptrv -> next = ptrv;
                }

nun will ich alle p.title, p.artist und vergleichen die den gleichen genre haben! und ausgegeben wird halt title/ artist (anzahl)
 
C:
PLAYLIST* ptr1 = letzteEingetragenePlaylist;
while(ptr1 != NULL)
{
    PLAYLIST* ptr2 = letzteEingetragenePlaylist;
    while(ptr2 != NULL)
    {
        if(ptr1==ptr2) continue;
        //vergleiche ptr2 mit ptr1
        ptr2=ptr2->next;
    }
    ptr1=ptr1->next;
}

Sowas?

Gruss
cwriter
 
Nun, einfach den Ausgangspunkt.
Entweder zählst du runter (next ist immer die vorher gelesene Struktur) oder du zählst hoch (next ist immer die nachher gelesene Struktur).
Dein Code scheint aber ein bisschen defekt zu sein.
C:
ptrv -> next = ptrv;
Wo ist der Sinn dahinter?

C:
ptrv = first;
while(ptrv == first)
ptrv = (PLAYLIST *) malloc(sizeof(PLAYLIST));
Zuerst setzt du ptrv aus irgendeinem Grund auf first, dann mallozierst du in einer genau 1x laufender Schleife.
First->next wird nie gesetzt und ptrv->next ist immer ptrv.

Bevor ich weitermache: Was hilft dir am meisten? Ein fertiger Code? Oder nur kleine Tipps?
Mache erstmal eine funktionierende verkettete Liste in einem eigenen Projekt. Ansonsten ist das hier sehr mühsam.

Gruss
cwriter
 
Zurück