2013-12-02 4 views
1

Итак ... что я пытаюсь сделать, это написать связанный список в файл, а затем снова прочитать его обратно в программу после завершения программы и перезапустить. Я продолжаю получать тарабарщину, когда читаю из файла в связанный список. Кроме того, я считаю, что цикл write() может писать один и тот же узел повторно. Я хотел бы знать, могу ли я что-то смешать. Кажется, я не могу найти проблему с кодом сам, потому что все, что я просматривал на страницах man и проверял google.читать() читать указатели или писать() записывать неправильные данные?

Соответствующий код:

struct test_t{ 
    int data; 
    char buf[LEN]; 
    struct test_t * next; 
}; 

struct test_t * new_node(struct test_t node, struct test_t * tail) 
{ 
    struct test_t * tmp = NULL; 

    if(!(tmp = malloc(sizeof(struct test_t)))) 
     return NULL; 

    tmp->data = node.data; 
    strcpy(tmp->buf, node.buf); 
    tmp->next = NULL; 
    if(tail) 
     tail->next = tmp; 

    return tmp; 
} 

... 

while(read(fd, &tmp, sizeof(struct test_t)) == sizeof(struct test_t)){ 
    printf("%d, %s\n", tmp.data, tmp.buf); 
    tail = new_node(tmp, tail); 
    if(head == NULL) 
     head = tail; 
    printf("%d, %s\n", tail->data, tail->buf); 
} 

... 

fd = open("test.txt", O_WRONLY | O_CREAT, 0666); 
iter = head; 
while(iter){ 
    printf("%d\n", write(fd, &iter, sizeof(struct test_t))); 
    printf("%d, %s\n", iter->data, iter->buf); 
    iter = iter->next; 
} 

Это выход из цикла записи:

112 
1, a 
112 
2, b 
112 
3, c 
112 
4, d 
112 
5, e 

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

Выход для диагностики PRINTF годов в цикле чтения является:

23728144, 
23728144, 
23728272, 
23728272, 
23728400, 
23728400, 
23728528, 
23728528, 
23728656, 
23728656, 

Выход заставляет меня думать, что это положить значение следующего указателя в междунар данных. Любая идея, почему: 1) Я мог бы писать() на том же узле пять раз подряд? 2) Я получаю тарабарщину, когда читаю()?

ответ

1

У вас есть слишком много уровней указателя косвенности в вашем write вызова:

write(fd, &iter, sizeof(struct test_t)) 
     ^

Удалите & из iter и вы будете писать данные из вашего списка узла вместо данных, хранящихся на указатель на ваш (возможно, включая другие значения из вашего стека, которые при неопределенном поведении).

С первого взгляда остальная часть кода выглядит нормально.

+0

Именно так. Благодарю. Прекрасно работает. – ciphermagi

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