Я бы сказал, что у вас есть как минимум две проблемы с кодом, который вы показываете. Во-первых, вы читаете и игнорируете самой первой строки. Во-вторых, вы не очень хорошо обрабатываете ошибки. В-третьих, вы читаете одну «строку» из файла, а затем перебираете все 2-мерного массива (когда вам нужно только установить значения одной строки).
С несколькими изменениями вы можете решить все три из этих проблем (третья - то, о чем вы, кажется, спрашиваете):
int current_row = 0;
// Read all lines in a loop
while (fgets(str, BUFSIZE, fpr) != NULL)
{
// Parse the line we just read, read directly into the row
if (sscanf(str, "%d; %d; %d; %d; %d; %d",
&family[current_row][0],
&family[current_row][1],
&family[current_row][2],
&family[current_row][3],
&family[current_row][4],
&family[current_row][5]) == 6)
{
// Parsing successful, advance to the next row
++current_row;
}
}
// All data read from the file
// The number of lines that was actually read and successfully parsed is in
// the variable current_row
// Example iterating over all records that were read from the file
for (int i = 0; i < current_row; ++i)
{
printf("family[%d][0] = %d\n", i, family[i][0]);
}