Я ищу функцию read() для чтения во всех структурах данных, каждая из которых будет иметь тот же тип, что и любой другой, но с разными данными, затем поместите их в связанный список. По какой-то причине я не могу найти никакой конкретной информации о том, как завершить цикл, который будет включать read(fp, &tmp, sizeof(struct foo))
, а затем new_node(tmp)
.Операции множественного чтения() в том же файле
Я хотел бы иметь возможность просто читать до EOF, но я не знаю, как это сделать с помощью функции read(), где есть EOF. Очевидно, что я мог бы использовать обходной путь с функцией write(), в которой я бы включил количество структур в файл перед записью, а затем прекратил функцию чтения, когда я достиг этого числа, но это кажется немного неуклюжим и позволяет избежать первоначального идея знать, когда файл завершается.
FOLLOW-UP:
Я ценю помощь, и я реализовал то, что я видел. К сожалению, я считаю, что могу читать неверную информацию. Соответствующий код:
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) Я получаю тарабарщину, когда читаю()?
Может проверить возвращаемое значение 'чтения()'? – wildplasser