Playlist auslesen

so was mache ich noch falsch! der compiler sagt das song in zeile 45 zum ersten mal vorkommt, obwohl das der name meines structes ist!

Code:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef struct song
{
	char tag[3];
	char title[30];
	char artist[30];
	char album[30];
	char year[4];
	char comment[30];
	int genre;
	struct song *next;
}PLAYLIST;

int main(int argc, char const *argv[])
{
	FILE *file_m3u;
	char meta[129];
	long size;
	size_t result;


	file_m3u = fopen("playlist.m3u", "r");

	char *name_m3u = malloc(sizeof(name_m3u));

	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);
                
              FILE *file_mp3 = fopen(file_name1, "r"); 
              
              fseek(file_mp3, -128, SEEK_END);
              
              fread(meta, 1, 128, file_mp3);
              
              memcpy(song, meta, 128);
              
              printf("%s\n", &song.title);
                
              
            }
 
Du hast "song" erst definiert, aber keine Variable dieses Typs im Code.
Schreibe oben (in der main) einfach ein "song Song;" hin.
Dann musst du alle "song"s in "Song"s ändern.
"name_m3u" ist indes als char* immer 4 bzw. 8 Bytes gross. Dein Code wird also nicht funktionieren.
Nimm mal lieber 200 als das sizeof().

Gruss
cwriter
 
Du sagst dem Compiler, was "song" ist: Ein Struct.
Der Compiler hat nun diese Definition.
Wenn du nun Daten in ein solches Struct füllen willst, hat der Computer zwar die Grösse davon (128+4) Bytes, aber nicht die Adresse, wohin die Daten geschrieben werden sollen.
C:
struct asd
{
//blabliblub
};

//später in der main
asd asd1;//asd ist der Typ (wie z.B. int ein Typ ist)
//asd1 ist deine Variable mit eigenem Speicherbereich

Alles klar?

Gruss
cwriter
 
habs jetzt so geschrieben!

Code:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef struct song
{
	char tag[3];
	char title[30];
	char artist[30];
	char album[30];
	char year[4];
	char comment[30];
	int genre;
	struct song *next;
}PLAYLIST;

int main(PLAYLIST p)
{
	FILE *file_m3u;
	char meta[129];
	song Song;
	


	file_m3u = fopen("playlist.m3u", "rb");

	char *name_m3u = malloc(sizeof(name_m3u));

	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);
                
              FILE *file_mp3 = fopen(file_name1, "rb"); 
              
              fseek(file_mp3, -128, SEEK_END);
              
              fread(meta, 1, 128, file_mp3);
              
              memcpy(Song, meta, 128);
              
              printf("%s\n", &p.title);
                
              
            }

nun will ich einmal schauen was in in den 128 zeichen drinnen ist! bevor ich es aufspalte und in mein struct kopiere! aber irgendwie will er es nicht machen! bin ich zu blöd dafür?
 
Zeile 47:
Weshalb hast du ein Struct als Argument für main? Dass dir der Compiler das kompiliert...
Das geht so nicht.
Statt
C:
printf("%s\n", &p.title);
schreibe
C:
printf("%s\n", Song.title);

Gruss
cwriter
 
sorry aber das funktioniert auch nicht!
der compiler gibt das aus:


In function 'main':
21 [Error] unknown type name 'song'
45 [Warning] passing argument 1 of 'memcpy' makes pointer from integer without a cast [enabled by default]
3 In file included from C:\Users\jenny\Desktop\ESP\gruppenbeispiel.c
41 c:\program files (x86)\dev-cpp\mingw64\x86_64-w64-mingw32\include\string.h expected 'void * __restrict__' but argument is of type 'int'

ich weiß wirklich nicht mehr weiter!
 
so jetzt kann ich es einlesen und ausgeben! hab es irgendwie geschafft! aber mein nächstes problem ist, das er mir nicht alles anzeigt!

also hier der code:
Code:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef struct song
{
	char tag[3];
	char title[30];
	char artist[30];
	char album[30];
	char year[4];
	char comment[30];
	int genre;
	struct song *next;
}PLAYLIST;

int main()
{
	FILE *file_m3u;
	char meta[129];
	char buffer[129];
	//song Song;
	


	file_m3u = fopen("playlist.m3u", "rb");

	char *name_m3u = malloc(sizeof(name_m3u));

	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);
                
              FILE *file_mp3 = fopen(file_name1, "rb"); 
              
              fseek(file_mp3, -128, SEEK_END);
              
              fread(meta, 1, 128, file_mp3);
              
              memcpy(buffer, meta, 128);
              
              printf("%s\n", buffer);
            }

so jetzt sollte beim buffer die letzten 128 bits stehen!

mein resultat schaut so aus:
Code:
4.mp3
TAGvier
5.mp3
TAGbest song ever
6.mp3
TAGsechs

so wo liegt jetzt der fehler, weil ich ja nun, mit dem buffer den ich ja jetzt hinzugefügt habe, alles aufsplitten muss und in den struct kopieren muss! aber das funktioniert ja nicht wenn ich ja nicht alle 128 bits habe!
 
Zuletzt bearbeitet:
Ich verstehe dich nicht.

Statt "song Song;" wäre es natürlich "PLAYLIST Song;"
Der Rest sind ignorierbare Warnungen.
Ein C-String ist als '\0'-Terminierter Bytearray definiert->Du liest über dieses '\0' hinaus ein, printf bricht da aber ab.
Du hast alle 128 Bytes (nicht bits) eingelesen...
Aufsplitten musst du nix.

Gruss
cwriter
 
Zuletzt bearbeitet:
Zurück