Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Cteni matice ze souboru

Aktivity
Avatar
davaj
Člen
Avatar
davaj:10.6.2014 23:49

Ahoj, chtel bych nacist matici[x][4] ze souboru:
1 1 0 1
1 1 0 1
1 1 0 1

ulozit 0 do pole[POCET][4]
a nasledne vypsat jenom 0.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(){
        FILE *soubor,*soubor2;
        int *a,*b,*vysledek,pocet,i,j;
        int *cteni_zapis[4];


        if((soubor=fopen("H:\\PRG\\soubory\\ukol4.txt","w+")) == NULL){
                printf("Spatne otevreni souboru !");
                getch();
                return -1;
        }

        printf("Zadej pocet prikladu: \n");
        scanf("%d",&pocet);
        a = (int*)malloc(sizeof(int)*pocet);
        b = (int*)malloc(sizeof(int)*pocet);
        vysledek = (int*)malloc(sizeof(int)*(pocet));
        for(i=0; i < pocet; i++)
                for(j=0; j < 4; j++)
                        cteni_zapis[i]=(int*)malloc(j*sizeof(int));

        srand(time(NULL));
        for(i=0; i < pocet; i++){
                a[i] = rand()%10+1;
                b[i] = rand()%10+1;
                fprintf(soubor,"%d %d",a[i],b[i]);
                printf("Zadej vysledek prikladu %d + %d\n",a[i],b[i]);
                scanf("%d",&vysledek[i]);
                fprintf(soubor," %d",vysledek[i]);
                fprintf(soubor," %d",a[i]+b[i]);
                if(i != pocet-1)
                        fprintf(soubor,"\n");
        }

        if(fclose(soubor) == EOF){
                printf("Spatne zavreni programu!");
                getch();
                return -1;
        }

        if((soubor=fopen("H:\\PRG\\soubory\\ukol4.txt","r")) == NULL){
                printf("Spatne otevreni souboru !");
                getch();
                return -1;
        }

        for(i=0; i < pocet; i++)
        {
                fscanf(soubor,"%d",&cteni_zapis[i][2]);
                printf("%d ",cteni_zapis[i][2]);
        }

        free(a);
        free(b);

        if(fclose(soubor) == EOF){
                printf("Spatne zavreni programu!");
                getch();
                return -1;
        }


        getch();
        return 0;
}

Pokud se nekdo najde, co se na to podiva, tak diky. :)

Editováno 10.6.2014 23:50
 
Odpovědět
10.6.2014 23:49
Avatar
Odpovídá na davaj
Neaktivní uživatel:11.6.2014 0:37

No tak pár poznámek ke kódu, co mě hned praštilo do očí (teď neřeším, jak by to šlo udělat líp):

-- pro index 0 v cteni_zapis alokuješ paměť o velikosti 0 (protože j = 0)
-- nechápu, proč jsou proměnné a, b, vysledek a cteni_zapis pole
-- chybí uvolnění paměti na vysledek a cteni_zapis

No a teď jak to vyřešit (a tím odpadnou věci, co jsem zmiňoval):

  • budeš načítat čísla a každé třetí číslo na řádku si uložíš, zbytek zahodíš

Ten for, kterým to vypisuješ by mohl vypadat takto:

for(i=0; i < pocet; i++)
{
        int tmp, vysledek;
        fscanf(soubor,"%d %d %d %d",&tmp,&tmp,&vysledek,&tmp);
        printf("%d ",vysledek);
        // jde se na další řádek
}

http://pastebin.com/BVAafW92

Editováno 11.6.2014 0:38
Nahoru Odpovědět
11.6.2014 0:37
Neaktivní uživatelský účet
Avatar
davaj
Člen
Avatar
davaj:11.6.2014 14:05

Aha, jak jsem si predstavil co chci a to takovy to tvar
1 1 0 1
1 1 0 1
1 1 0 1
tak me nenapadlo ze scanf to umi precist, napadlo me jen to, ze si urcim radek, sloupec pole a vyctu to z toho.

Díky :)

 
Nahoru Odpovědět
11.6.2014 14:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.