Jazyk C - vícerozměrné pole

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Hoonzooid
Začátečník
Začátečník
Uživatelský avatar
Registrován: 12. led 2005

Jazyk C - vícerozměrné pole

Příspěvek 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 :-)
Case: TCLink S-313BK - Middletower, CPU: Intel Core i3-3240 @ 3.4GHz, MB: Gigabyte GA-Z77-D3H, GPU: Sapphire AMD Radeon R9 270X, RAM: 8GB DDR3, SSD: Kingston HyperX 3K 120GB, HDD: Samsung HD502HJ 500GB SATA, CD/DVD: Samsung SH-S183L, Monitor: 24" DELL U2412M, Zdroj: Fortron FSP350-60THN-P 350W
kybrex
Začátečník
Začátečník
Uživatelský avatar
Registrován: 16. dub 2006
Bydliště: V sudu... (plnej samozřejmě)
Kontaktovat uživatele:

Příspěvek 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:

CPU: Intel Pentium (Prescott) 2,8GHz / 800MHz cache L1 16kB, L2 1MB; + CoolerMaster S9U1 Hyper TX MotherBoard: ASUS P5GD1PRO Intel 915P PCI-Express, GPU: ATI Radeon X700PRO 425MHz 128MB GDDR3 (860MHz), RAM: 2x256MB + 2x512MB 400MHz, HDD: Western Digital Caviar 320GB cache 16MB + Western Digital 1000GB 16MB cache, DVD mechanika: LG HL-DT-ST DVDRAM GSA-4082B writing: 8x DVD-R/+R, 4x DVD+RW/-RW, 3x DVD-RAM, 24x CD-R, 16x CD-RW reading: 12x DVD, 10x DVD-RW/+RW, 3x DVD-RAM, 32x CD. LCD: 19" AG Neovo F-419, CRT: 17" ADI Microscan M700, REPRO: Eltax concept 400 + Omnitronic P-250

NOTEBOOK:
Hewlett Packard 550 :: CPU: C2D T5270 @1,4GHz L2 Cache 2MB, FSB 800MHz, RAM: 2+2 GB DDR2 667 MHz, Chipset: Intel GME965, HDD: 160 GB 5400 RPM Serial ATA, DVD±RW, Komunikace: Modem 56 Kbit/s, 10/100 Mbit/s LAN Ethernet Controller, Wireless LAN 802.11a/b/g, BlueTooth
WoiTa
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 07. říj 2004
Bydliště: Chrudim, Brno
Kontaktovat uživatele:

Re: Jazyk C - vícerozměrné pole

Příspěvek 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.
Hoonzooid
Začátečník
Začátečník
Uživatelský avatar
Registrován: 12. led 2005

Příspěvek 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
Case: TCLink S-313BK - Middletower, CPU: Intel Core i3-3240 @ 3.4GHz, MB: Gigabyte GA-Z77-D3H, GPU: Sapphire AMD Radeon R9 270X, RAM: 8GB DDR3, SSD: Kingston HyperX 3K 120GB, HDD: Samsung HD502HJ 500GB SATA, CD/DVD: Samsung SH-S183L, Monitor: 24" DELL U2412M, Zdroj: Fortron FSP350-60THN-P 350W
Odpovědět

Zpět na „Programování a web“