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 :wink:

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