Snaž sa vždy zbaviť čo najviac hviezdičiek, pretože tie robia v programe iba bordel a robia ho veľmi neprehľadným. Ľahko tak vieš niečo prehliadnuť. Vždy sa snaž písať programy čo najprehľadnejšie, nech sa v tom vieš dobre vyznať nie len ty, ale aj hocikto iný, kto na to pozrie.
Ďalej, keď používaš viacrozmerné polia, musíš si poriadne rozmyslieť, ktorý pointer ukazuje kam a čo to znamená.
Takto nejako by to malo robiť to, čo chceš
Kód:
void nacitV(char ***p_meno, char ***p_ulica, double **p_dan, int **p_datum)
{
// pozri ako si zjednodusim pracu v celej funkcii
char **meno = *p_meno;
char **ulica = *p_ulica;
double *dan = *p_dan;
int *datum = *p_datum;
int j = 0;
FILE *file1 = fopen( "file.txt", "r" );
if( file1 == NULL )
{
printf("Nepodarilo sa otvorit subor");
return;
}
// ziadny else nie je potrebny
while ( !feof(file1) )
{
// rozsirim kazde pole o jedna
meno = (char **) realloc( meno, (j+1)*sizeof(char*) );
ulica = (char **) realloc( ulica, (j+1)*sizeof(char*) );
dan = (double *) realloc( dan, (j+1)*sizeof(double) );
datum = (int *) realloc( datum, (j+1)*sizeof(int) );
// alokujem si pamat pre novy string
meno[j] = (char*) malloc( N*sizeof(char) );
ulica[j] = (char*) malloc( N*sizeof(char) );
// citam subor a pri kazdej chybe skoncim (mozem trebars aj ohlasit chybu)
if( fgets(meno[j], N, file1) == NULL )
return;
if( fgets(ulica[j], N, file1) == NULL )
return;
if( fscanf(file1, "%lf\n", &dan[j]) != 1 )
return;
if( fscanf(file1, "%d\n", &datum[j]) != 1 )
return;
printf( "MENO : %s", meno[j] );
printf( "ULICA: %s", ulica[j] );
printf( "DAN: %lf\n", dan[j] );
printf( "DATUM: %d\n\n", datum[j] );
j++;
}
}
Ak chceš tieto polia ale ďalej v programe (mimo funkcie nacitV) používať, musíš si niekde vrátiť aj počet načítaných záznamov - tj. dĺžku každého pola.