Sądzę, że powinieneś użyć listy jednokierunkowej oraz funkcji fgetc.
Podana funkcja czytałaby poszczególne znaki pliku i dodawałaby je do listy, aż do napotkania symbolu nowej linii \n - oczywiście musiałbyś pamiętać o dodaniu na końcu napisu symbolu \0.
Każda lista znaków reprezentowałaby oddzielną linię pliku, więc mógłbyś zrobić listę list, aby nie podawać odgórnie ilości wierszy.
Konceptualnie mogłoby to wyglądać tak:
struct Znak
{
char znak;
Znak* wskaznik;
}
struct Lista
{
Znak* glowa;
Lista* wskaznik;
}
//...
Lista* glowa_lista = NULL; // Głowa listy zbudowanej z obiektów struktury "Lista" (lista list)
int flaga = 1;
while(flaga)
{
Znak* glowa_znak = NULL; // Głowa listy zbudowanej z obiektów struktury "Znak" (lista znaków)
while(true)
{
char znak = fgetc(plik);
if(znak == '\n')
{
dodajDoListy(glowa_znak, '\0');
break;
}
if(znak == -1)
{
dodajDoListy(glowa_znak, '\0');
flaga = 0;
break;
}
dodajDoListy(glowa_znak, znak);
}
dodajDoListy(glowa_lista, glowa_znak);
}
// Wypisanie na ekran kolejnych wierszy pliku
for(int i = 0; i < dajWielkoscListy(glowa_lista); i++)
{
for(int j = 0; j < dajWielkoscListy(dajElementListy(glowa_listy, i)); j++)
printf("%c", dajElementListy(glowa_znak, j));
printf("%c", '\n');
}