Вы можете использовать fscanf
для чтения каждой строки из файла, strtok
для токенизации прочитанной строки.
Поскольку элементы вашей структуры являются указателями, распределяйте память соответствующим образом.
Следующий минимальный код делает именно то, что вы хотите.
#define SIZE 50
FILE *fp = NULL;
int i = 0;
struct employee var = {NULL, NULL, 0, NULL};
char line[SIZE] = {0}, *ptr = NULL;
/* 1. Open file for Reading */
if (NULL == (fp = fopen("file.txt","r")))
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
/* 2. Allocate Memory */
var.empname = malloc(SIZE);
var.empid = malloc(SIZE);
var.addr = malloc(SIZE);
/* 3. Read each line from the file */
while (EOF != fscanf(fp, "%s", line))
{
/* 4. Tokenise the read line, using "\" delimiter*/
ptr = strtok(line, "\\");
var.empname = ptr;
while (NULL != (ptr = strtok(NULL, "\\")))
{
i++;
/* 5. Store the tokens as per structure members , where (i==0) is first member and so on.. */
if(i == 1)
var.empid = ptr;
else if(i == 2)
var.age = atoi(ptr);
else if (i == 3)
var.addr = ptr;
}
i = 0; /* Reset value of i */
printf("After Reading: Name:[%s] Id:[%s] Age:[%d] Addr:[%s]\n", var.empname, var.empid, var.age, var.addr);
}
Рабочая демонстрация: http://ideone.com/Kp9mzN
Несколько вещей, которые следует отметить здесь:
- Это гарантированно сработает, пока определение вашей структуры (и порядок членов) остается прежним (см. манипуляции со значением
i
).
strtok(line, "\\");
, Второй аргумент просто экранирует (первый \
) фактический символ \
.
Уточнение от ОП:
В определении вашей структуры третий член — это int
, однако вы пытаетесь прочитать в него t35
(это строка).
Таким образом, var.age = atoi(ptr);
даст вам 0
,
Вы можете изменить определение структуры, сделав третий элемент char *
и распределив память так же, как и другие элементы.
Или измените содержимое файла, убедившись, что int
присутствует в качестве третьего значения.
person
Saurabh Meshram
schedule
17.12.2014