Какого все-таки страшного Слонопотама вы рисуете.
Код:
size_t fillStruct(FILE *file, struct person bigArray[], size_t arraySize) {
    size_t index = 0;
    while((index < arraySize) && !feof(file)) {
        if (fscanf(file, " %9s %9s %19s \n", bigArray[index].name, bigArray[index].surname, bigArray[index].number) == 3) {
            ++index;
        }
    }
    return index;
}
Используется это примерно так:
Код:
if(!strcmp(mode,"Read"))
{
    size_t i, count;
    if((MyBook = fopen("MyBook.txt", "r")) == NULL) { 
        printf("Reading MyBook.txt error");
    } 
    else {
        count = fillStruct(MyBook, Contacts, SIZE);
        printf("%d\n", count);
        for (i = 0; i < count; ++i) {
            printf("%s %s %s\n", Contacts[i].name, Contacts[i].surname, Contacts[i].number);
        }
        fclose(MyBook);
    }
}
И да, уберите вы в
Код:
unsigned char *pname = &NewData.name;
unsigned char *psurname = &NewData.surname;
unsigned char *pnumber = &NewData.number;
амперсанды. Неужели компилятор не выводит предупреждение, что там типы разнятся?