2017-01-28 4 views
0

Ich versuche, einen Struct-Song zu meinem Struct-Pointer-Song * hinzuzufügen, aber wenn ich versuche, es in eine Datei zu schreiben, gibt es einfach Junk aus. Dies ist meine Funktion:C - Hinzufügen eines Elements zu einem Struct-Zeiger

void addSong(Song *song, char songName[], char artistName[], int publicationYear, int *nrOfSongs) 
{ 
    Song *tempSongs = (Song*)malloc(sizeof(Song)*(*nrOfSongs)); 

    for (int i = 0; i < (*nrOfSongs); i++) 
     { 
      strcpy(tempSongs[i].artistName, song[i].artistName); 
      strcpy(tempSongs[i].songName, song[i].songName); 
      tempSongs[i].publicationYear = song[i].publicationYear; 
     } 

    free(song); 
    *nrOfSongs = (*nrOfSongs) + 1; 
    song = (Song*)malloc(sizeof(Song)*(*nrOfSongs)); 


    for (int i = 0; i < ((*nrOfSongs)-1); i++) 
     { 
      strcpy(song[i].artistName, tempSongs[i].artistName); 
      strcpy(song[i].songName, tempSongs[i].songName); 
      song[i].publicationYear = tempSongs[i].publicationYear; 
     } 
} 

Edit 1: Sorry für die schlechte Frage.

Meine Funktion writeToFile:

void writeToFile(char fileName[], Song *song, int *nrOfSongs) 
{ 
    char name[256]; 
    snprintf(name, sizeof(name), "%s.txt", fileName); 
    FILE * file = fopen(name, "w"); 

    fprintf(file, "%d", *nrOfSongs); 
    fputc('\n', file); 

    for (int i = 0; i < (*nrOfSongs); i++) 
    { 
     fputs(song[i].songName, file); 
     fputs(song[i].artistName, file); 
     fprintf(file, "%d", song[i].publicationYear); 
     fputc('\n', file); 
    } 

    fclose(file); 
} 

Ein Beispiel einer solchen Datei:

4 
Mr Tambourine Man 
Bob Dylan 
1965 
Dead Ringer for Love 
Meat Loaf 
1981 
Euphoria 
Loreen 
2012 
Love Me Now 
John Legend 
2016 

Ich möchte ein Lied addieren und durch die ich will ein Künstlername, songname und Publication meiner Struktur hinzufügen Zeiger und schreiben Sie dann den Strukturzeiger auf eine neue Datei.

+0

Es gibt keinen Grund, dass diese Funktion ungültig wird. Geben Sie stattdessen einen Zeiger auf die zugeordneten Strukturen zurück. – wildplasser

+0

Der Großteil des wichtigen Teils fehlt. Sie zeigen nichts über das Schreiben in eine Datei. Wie nennst du deine Funktion? Wie schreibst du in eine Datei? Was erwartest du geschrieben zu werden? Was ist in der Datei? Wie überprüfen Sie, was geschrieben wurde? – Gerhardh

+0

Benötigt mehr [mcve]. – melpomene

Antwort

0

Statt Kopieren über Arrays zweimal, dann sollten Sie das Array song mit realloc(), vergrößern und fügen Sie einfach das neue Element, um es, wie so:

Song *addSong(Song *song, char songName[], char artistName[], int publicationYear, int *nrOfSongs) { 
    *nrOfSongs++; 
    song = realloc(song, *nrOfSongs * sizeof *song); 
    // Don't forget to do error checking here, realloc() may return NULL 

    strcpy(song[*nrOfSongs - 1].artistName, artistName); 
    // et cetera 

    return song; 
} 

Da Sie den Speicher Umschichtungen vorzunehmen, um den Zeiger auf die Array ändert sich, so dass Sie den neuen Zeiger auf den Aufrufer zurückgeben müssen, wie @WildPlasser sagt.

Auch strcpy() ist eine unsichere Funktion. Erwägen Sie die Verwendung einer sichereren Alternative wie snprintf().

+0

Hinweis 'strncpy()' ist eine schreckliche Funktion, und hier sicherlich nicht verwendbar. – wildplasser

+0

Nun ja, es 'strncpy()' hat seine eigenen Probleme. Ich habe den Text aktualisiert, um "snprintf()" vorzuschlagen, was etwas übertrieben ist. 'strlcpy()' oder 'strcpy_s()' könnten auch Optionen sein, wenn Ihre Plattform diese unterstützt. –

Verwandte Themen