Вы можете использовать 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
Несколько вещей, чтобы отметить здесь:
- Это гарантированно работать, до тех пор, как вы r (и порядок членов) остается неизменным (см. манипулирование значением
i
).
strtok(line, "\\");
, Второй аргумент просто ускользает (первый \
) фактический символ \
.
Разъяснение от OP:
В вашем определении структуры, третьего член является int
, однако вы пытаетесь читать t35
в него (который является строкой).
Так var.age = atoi(ptr);
даст вам 0
,
Вы можете изменить определение структуры, что делает третий член в char *
и выделении памяти, как и другие члены.
Или измените содержимое файла, убедившись, что в качестве третьего значения присутствует int
.
Было бы легко удалить завершающую 'новую строку' с помощью' strtok (buffer, "\ t \ n") '. –