Давайте предположим, что у нас есть файл, который содержит:Как получить int и строку из файла и сохранить его в структуре?
1 John
2 Alex
3 Michael
Мы можем получить одну строку, используя fscanf()
функцию, но как сохранить его ниже структуры:
typedef struct entry {
int n;
char *name;
} entry_t;
Я хочу, чтобы создать массив структуры и сохранять значения из файла в файл и делать это динамически. Я пытался делать это таким образом
entry_t *prt = malloc (size * sizof(entry_t));
//opening file
prt[0].name = malloc (sizeof("John"));
fscanf (fp,"%d %s", prt[0].n, prt[0].name);
Хорошо, это работает, но как выделить память для каждого имени, прежде чем получить его из текстового файла? Я решил использовать массив структур, потому что я буду использовать его для реализации хэш-таблицы.
Вы не можете выделить _before_, так как вы не знаете размер. 'strlen' каждое из ваших имен из файла, а затем' malloc' – mihai
У вас есть как минимум два варианта. (1) Большинство портативных: 'char buffer [1024]; if (fscanf (fp, "% d% 1023s", & prt [0] .n, buffer) == 2) {prt [0] .name = strdup (buffer); ... использовать значения после проверки работы strdup ...} else {... handle error ...}}, который использует большой буфер для чтения значения, а затем выделяет память впоследствии; или (2) Использование функций POSIX в ['fscanf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html): 'if (fscanf (fp,"% d% ms " , & prt.n, & prt [0] .name) == 2) {... использовать значения read ...} else {... handle error ...} '. Обратите внимание на ограничение размера для первого вызова. –
Вызов 'fscanf()' не должен компилироваться - вы пропустили аргумент указателя файла. –