Stránka 1 z 1
Jazyk C - vícerozměrné pole
Napsal: čtv 29. kvě 2008, 09:41
od Hoonzooid
Zdar, chtěl bych si ze souboru (např. matice.txt) načíst prostě matici čísel do vícerozměrného pole. Pak spočítat aritmetické průměry jednotlivých řádků a sloupců. Ale nějak nevím, jak načíst tu matici správně do vícerozměrného pole!
if ((fr = fopen("matice.txt","r")) == NULL)
{
printf("Soubor nelze otevrit!\n");
system("PAUSE");
exit(1);
}
Soubor si normálně otevřu. Teď musím nejspíš číst ze souboru po znaku a ukládat do pole. Takže mám cyklus while:
while ((c = getc(fr)) != '\n')
ale teď nevím jestli to mám pomocí cyklu for načíst do pole nebo jak. Mohl by mi někdo z vás helpnout?? Moc díky

Napsal: čtv 29. kvě 2008, 11:20
od kybrex
Tak jestli si to představuju dobře, tak se čte ze souboru po znacích a po řádcích.

Hodil bych tam dva do sebe vnořené cykly, jeden posunuje řádky a druhej sloupce. Akorát to budeš asi muset pustit dvakrát, abys nejdřív odpočítal kolik je řádků a kolik sloupců (podle podmínky if(znak=='\n')) a sloupce podle prvního řádku spočítáním oddělovačů (třeba mezer) a ještě můžeš zkontrolovat, jestli ve všech řádcích jsou stejný počty prvků. Pak bych inicializoval int pole[x][y]; (nebo si ho můžeš dát na hromadu do volnýho úložiště - o tom jsem se radil tady:
http://pctforum.tyden.cz/viewtopic.php?t=122194) a nakonec to projeď znovu a nacpi tam ty čísla (samozřejmě podmínkou vyřešit oddělovače-mezeru něco jako if(znak==32) continue;).
PS: 32 je ASCII mezery

Re: Jazyk C - vícerozměrné pole
Napsal: čtv 29. kvě 2008, 12:14
od WoiTa
Viděl bych to nejak takhle:
Kód: Vybrat vše
int r=0,s=0;
while(c=getc(fr) != EOF){ //konec souboru
if (c == '\n') {
r++;
s=0;
continue;
}
matice[r][s] = c;
s++;
}
Pokud ale nechceš vytahovat ze souboru znaky, ale rovnou čísla, je lepší použít místo getc funkci fscanf.
Napsal: čtv 29. kvě 2008, 14:22
od Hoonzooid
2 WoiTa: jj, tohle je ono, moc dik...
Akorat sem to trosku pozmenil:
Kód: Vybrat vše
j = 0;
i = 0;
while ((c[0] = getc(fr)) != EOF)
{
if (c[0] == '\n')
{
i++;
j = 0;
}
else
{
pole[i][j] = atoi(c);
j++;
}
}
Předtim sem měl c typu int, ale pak mi nefungovala funkce atoi (ASCII to Integer), tak jsem dal c typu char a už to frčí. Asi to není nejlepší řešení, takže to zkusím ještě s tim fscanfem... Ale jinak dik moc