Прежде всего, пожалуйста, отметьте домашнее задание как домашнее задание.
Во-вторых, как указал мистер Листер, вы выделяете переменную line
длиной 80 символов, но вы читаете в нее до 100 символов из файла - с длинными строками это может вызвать проблемы. Вы должны прочитать не более 79 символов (оставляя 1 для \0
в конце).
Теперь по поводу "печати", я думаю, что ваша проблема в следующих строках:
p[nameIndex].name = (char*)malloc(sizeof(line));
p[nameIndex].gender = (char*)malloc(sizeof(line));
p[nameIndex].age = (char*)malloc(sizeof(line));
Поскольку line
по сути является char *
, sizeof(line)
не даст вам ожидаемых результатов. Вместо этого вы должны использовать функцию strlen
- и не здесь, а в том месте, где вы копируете данные. Ваш код должен выглядеть примерно так:
switch(i)
{
case 1:
p[nameIndex].name = (char*)malloc(strlen(tmp) + 1);
strcpy(p[nameIndex].name, temp);
break;
case 2:
p[nameIndex].gender = (char*)malloc(strlen(tmp) + 1);
strcpy(p[nameIndex].gender, temp);
break;
case 3:
p[nameIndex].age = (char*)malloc(strlen(tmp) + 1);
strcpy(p[nameIndex].age, temp);
break;
default:
break;
}
Конечно, это предполагает, что каждый символ занимает 1 байт памяти. В противном случае вы должны использовать (strlen(tmp) + 1) * sizeof(char)
, чтобы получить правильное распределение.