2015-02-07 2 views
0

Я пытаюсь написать функцию, которая может читать некоторую информацию из файла в узел в двусвязном списке. Формат данных каждого узла выглядит следующим образом.Запись в связанные списки с вложенными структурами

структура (названная запись)
художника
альбома
песня
жанр
songLength (Это еще одна структуры, которая содержит минуты и секунды)
прослушиваний
рейтинга

void load(FILE *file, Node *head) 
{ 
    char tempArtist='\0', tempAlbum='\0', tempTitle='\0', tempGenre='\0' 
    ,tempSpace='\0',tempMins='\0',tempSecs='\0'; 
    SongLength *tempLength=NULL; 
    int tempPlay=0, tempRating=0,test=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,"%s",&tempSpace); 

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

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

} 

Это моя текущая функция нагрузки. При попытке сохранить эти значения в данных узлов я получаю нарушение доступа.

Вот мои Структуры для легкого воспроизведения

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 node *pNext; 
    struct record *data; 

}Node; 

makeNode

Node *makeNode(Record *newData) 
{ 
    Node *temp = NULL; 

    temp=(Node*)malloc(sizeof(Node)); 

    temp->data=newData; 
    temp->pNext=NULL; 

    return temp; 
} 

Если любая путаница возникает просто дайте мне знать! Также это мой первый опыт работы с динамической памятью, поэтому будьте осторожны: P

Спасибо!

+0

Когда вы используете динамическую память, вам нужно явно указать '' malloc'''. У вас возникла проблема, поскольку вы объявляете '' tempLength'' в качестве указателя, а затем никогда не выделяете для нее никакой памяти. –

+0

@SimonGibbons Будет ли память еще не выделена при инициализации головного узла?(бывает в основном) – user3482104

+0

Да возможно (но я не вижу этот код), однако, когда вы делаете 'tempLength-> mins = tempMins;' 'вы используете' 'tempLength'', который ничего не знает о какой-либо памяти вы ранее выделили эту структуру. –

ответ

1

Вы не назначили память для переменной tempLength для указания на.

Добавьте это перед обращением элементов

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

EDIT

Я просто дает общее представление, как выделять и использовать вложенные для структур при

Node *head; 
Record *r=malloc(sizeof(struct record)); 
SongLength *s=malloc(sizeof(struct songlength)); 
r->length=s;//<----- 1 
r->length->mins=10;//Now you can assign values 

head=malloc(sizeof(struct node)); 
head->pPrev=NULL; 
head->pNext=NULL; 
head->data=r;//<--- The length member inside record is already assigned memory in 1 

head->data->artist='c'; 
head->data->length->mins=10;//assign 
+0

Эта работа, но затем она начала прерываться при попытке назначить проверенные данные узлу. Должен ли я также использовать malloc для каждой из переменных temp, которые я сделал? – user3482104

+0

@ user348104 Вы должны выделить память для 'songlength' внутри' record', прежде чем передать ее в 'makeNode' – user7

+0

' char' может содержать только один символ. Вы должны использовать массив в качестве ответов саху – user7

2

Эти линии неверны.

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,"%s",&tempSpace); 

Они определенно приведут к неопределенному поведению из-за способа определения переменных.

Вы не можете ожидать

char c = '\0'; 
fscanf(file, "%s", &c); 

работать. Недостаточно памяти на &c, чтобы прочитать строку. Вам нужно что-то вроде:

char s[100]; // Or some size that is large enough to hold the data 
      // you are about to read. 
fscanf(file, "%99s", s); // Make sure that you don't read more than 99 
         // characters. Leave at least one character 
         // for the terminating null character. 

Надеюсь, это даст вам достаточно информации о том, как изменить переменные.

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