2015-02-08 10 views
0

После того, как я прочитал некоторые данные из файла, назначьте его записи типа структуры в узле, данные совпадают с данными файла. После того, как я оставлю функцию чтения и вернусь к основному, данные остаются неизменными. Но когда я пытаюсь распечатать его, это становится беспорядочным беспорядком.Данные изменяются во время печати

нагрузки Функция

void load(FILE *file, Node *head) 
{ 
    char tempArtist[30]={'\0'}, tempAlbum[30]={'\0'}, tempTitle[30]={'\0'}, tempGenre[30]={'\0'},tempSpace='\0'; 
    SongLength *tempLength=NULL; 
    int tempPlay=0, tempRating=0, tempMins=0, tempSecs=0; 

    tempLength = (SongLength*)malloc(sizeof(SongLength)); 

    fscanf(file,"%s",&tempArtist); 
    fscanf(file,"%s",&tempAlbum); 
    fscanf(file,"%s",&tempTitle); 
    fscanf(file,"%s",&tempGenre); 
    fscanf(file,"%s",&tempMins); 
    fscanf(file,"%s",&tempSecs); 
    fscanf(file,"%s",&tempPlay); 
    fscanf(file,"%s",&tempRating); 
    fscanf(file,"%c",&tempSpace); 

    tempLength->mins=&tempMins; 
    tempLength->secs=&tempSecs; 

    head->data->album=tempAlbum; 
    head->data->artist=tempArtist; 
    head->data->genre=tempGenre; 
    head->data->song=tempTitle; 
    head->data->length=tempLength; 
    head->data->played=tempPlay; 
    head->data->rating=tempRating; 
} 

печати Функция тестирования

int main(void) 
{ 
    FILE *loadFile = NULL; 
    Node *head=NULL; 

    head=(Node*)malloc(sizeof(Node)); 
    head->data=(Record*)malloc(sizeof(Record)); 
    head->data->length=(SongLength*)malloc(sizeof(SongLength)); 

    loadFile=fopen("records.txt","r"); 

    load(loadFile,head); 
    head->data->artist; // artist matches the name in load file (aka snoop) 
    printf("%s", head->data->artist); // When trying to print here it prints a smiley face 
} 

Extra информация для легкой репликации

typedef struct songlength 
{ 
    int *mins; 
    int *secs; 
}SongLength; 


typedef struct record 
{ 
    char *artist; 
    char *album; 
    char *song; 
    char *genre; 
    struct songlength *length; 
    int played; 
    int rating; 

}Record; 

typedef struct node 
{ 
    struct node *pPrev; 
    struct record *data; 
    struct node *pNext; 

}Node; 

Файл данных Формат

snoop 
heartbeat 
swiggity 
rap 
03 
10 
25 
4 

ответ

0

Вы undefined behavior, потому что вы назначаете указатели на локальные массивы в head структуры.

Например, массив tempArtist будет выходить за рамки только функция load возвращается, поэтому любые указатели, указывающие на этот массив (как head->artist) будут паразитные указателями и derefeencing того указателя приведет к указанному неопределенному поведению.

+0

Итак, какой был бы лучший способ решить эту проблему? – user3482104

+0

@ user3482104 Два решения действительно: либо вы динамически выделяете указатели в структуре и копируете строки, либо делаете строки в массивах структуры и копируете строки. –