Diskuze: Cteni matice ze souboru

C++ C a C++ Cteni matice ze souboru

Avatar
davaj
Člen
Avatar
davaj:

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
Posix
Člen
Avatar
Odpovídá na davaj
Posix:

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
Proč to dělat jednoduše, když to jde složitě.
Avatar
davaj
Člen
Avatar
davaj:

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.