2017-01-28 4 views
0

私は構造体のソングに構造体のソングを追加しようとしていますが、ファイルに書き込もうとしたときにジャンクを出してしまいます。C - 構造体ポインタに要素を追加する

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; 
     } 
} 

編集1:悪い質問には申し訳ありません これは私の関数です。

My機能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); 
} 

ファイルの例:

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

私は曲を追加したい、それによって私は私の構造体にartistName、songNameとpublicationYearを追加したいですポインタを作成し、構造体ポインタを新しいファイルに書き込みます。

+0

この関数がvoidを返す理由はありません。代りに割り当てられた構造体へのポインタを返してください。 – wildplasser

+0

重要な部分の大部分が欠落しています。あなたはファイルへの書き込みについて何も表示しません。あなたはどのようにあなたの機能を呼びますか?どのようにファイルに書き込むのですか?あなたは何を書いていると思いますか?ファイルには何が入っていますか?何が書かれたかをどうやって確認するのですか? – Gerhardh

+0

さらに[mcve]が必要です。 – melpomene

答えて

0

代わりの配列を超えるコピー二回、あなたはrealloc()を使用してアレイsongを拡大しなければならない、とちょうどそのように、それに新しい要素を追加します。あなたは、へのポインタをメモリに再割り当てされているので

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; 
} 

@wildplasserのように、新しいポインタを呼び出し側に返さなければなりません。また、strcpy()は危険な機能です。 snprintf()のようなより安全な代替方法の使用を検討してください。

+0

注意 'strncpy()'はひどい関数であり、ここでは使用できません。 – wildplasser

+0

さて、 'strncpy()'には独自の問題があります。私は 'snprintf()'を提案するようにテキストを更新しました。これはちょっと残酷です。あなたのプラットフォームがそれらをサポートしていれば、 'strlcpy()'や 'strcpy_s()'もオプションになります。 –

関連する問題