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

Edit 1: Извините за плохой вопрос.

Моя функция 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

Нет причин для возврата этой функции. Вместо этого верните указатель на выделенные структуры. – wildplasser

+0

Большая часть важной части отсутствует. Вы ничего не показываете о записи в файл. Как вы называете свою функцию? Как вы пишете файл? Что вы ожидаете написать? Что находится в файле? Как вы проверяете, что было написано? – Gerhardh

+0

Требуется больше [mcve]. – melpomene

ответ

0

Вместо копирования над массивами в два раза, вы должны увеличить массив song с помощью realloc(), и просто добавить новый элемент к нему, например, так:

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()' также могут быть параметрами, если ваша платформа поддерживает их. –

Смежные вопросы