Q:

Error durante la lectura de datos desde un archivo a una estructura

Me encuentro recogiendo datos de un fichero, del fichero quiero coger el DNI y el nombre, y el error me lo da al intentar guardar los nombres en los distintos compartimentos usando Nombre[i].
Codigo:
#include <stdio.h>
#include <string.h>
#define MAX 100
int main(){
FILE *f1;
char Linea1[200],Linea2[200],Apellido[14],linea[40];
char Nombre[70];
int DNI[9];
int i=0;
f1=fopen("h.txt","r");
fgets(Linea1,200,f1);
fgets(Linea2,200,f1);
while(!feof(f1)){
        do{
                i=0;
   fscanf(f1,"%s %s %[^\n]",DNI[i],Nombre[i],linea);
   i++;
        }
        while(linea==NULL);

}

fclose(f1);

}

Les dejo también el fichero por si acaso les ayuda a localizar el error:
Fecha Examen: 2018/08/09
Numero de pruebas: 6
23321223D Markel Zubieta 4.47 3.06 5.09 5.11 8.18 7.95 6.44 3.79 8.12 5.33 2000/2/3
13080976G Antonio Gonzalez Perez 3.51 2.08 3.01 4.71 1943/12/21
34235676F Jose Luis Martinez Garcia 2.26 1.85 9.05 9.80 4.39 1986/2/29
X345432Y Victor Mayo 2.58 4.09 5.9 2.6 6.3 7.1 4.24 5.08 2000/11/12
20205632S Silva Martinez Fernandez 0.86 2.62 8.01 0.9 9.2 7 4.89 5.79 2.37 7 1970/04/10

A:

El error es este:
fscanf(f1,"%s %s %[^\n]",DNI[i],Nombre[i],linea);

DNI está declarado como entero, pero lo estas leyendo como caracter. Nombre es un  arreglo de caracteres con capacidad para un solo nombre. Lo que tú quieres es poder almacenar varios DNI y Nombres. Para eso usare una estructura que los unifique, y cambiare el tipo de DNI a char:
#define MAX_ALUMNOS 30

struct {
    char Nombre[70];
    char DNI[10];
} curso[MAX_ALUMNOS];

Asi tengo un curso con alumnos, y cada alumno tiene un DNI de 9 caracters + '\0' y un nombre de 69 caracteres + '\0'.
Otro problema es que estas reiniciando el indice 'i' en cada iteración. Cambiare esa variable por 'alumno', ya que nombres significativos ayudan a la comprensión del código.
Con todo, queda así:
#include <stdio.h>
#include <string.h>

#define MAX_ALUMNOS 100

int main() {
    FILE *f1;
    char Linea1[200], Linea2[200], Apellido[14], linea[40];
    struct {
        char Nombre[70];
        char DNI[10];
    } curso[MAX_ALUMNOS];
    
    f1 = fopen("h.txt", "r");
    fgets(Linea1, 200, f1);
    fgets(Linea2, 200, f1);

    int alumno = 0;
    while (!feof(f1)) {
       fscanf(f1, "%s %s %[^\n]", curso[alumno].DNI, curso[alumno].Nombre, linea);
       alumno++;
    }
    fclose(f1);
    for (int i = 1; i <= alumno; i++) {
        printf("%d %s %s\n", i, curso[i].DNI, curso[i].Nombre);
    }
}

Nota: no hay manejo de errores.
Demostración
Con el archivo proporcionado, la ejecución produce:
0 23321223D Markel
1 13080976G Antonio
2 34235676F Jose
3 X345432Y Victor
4 20205632S Silva

Sólo se leyó el primer nombre, pues eso es lo que hace scanf cuando encuentra "%s" ... leer hasta el primer espacio.

