Načtení matice ze souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načtení matice ze souboru – C / C++ – Fórum – Programujte.comNačtení matice ze souboru – C / C++ – Fórum – Programujte.com

 

Durza
~ Anonymní uživatel
24 příspěvků
30. 11. 2012   #1
-
0
-

Zdravím
Mám napsat Set-Cover ale data beru z texťáku ve kterém mam množiny jako řádky, kde jsou čísla oddělená mezerou
chci to načíst do matice a nevím jak na to, nějak sem to plácal ale nepovedlo se.

Nahlásit jako SPAM
IP: 85.92.58.–
Durza
~ Anonymní uživatel
24 příspěvků
30. 11. 2012   #2
-
0
-

Vstupní soubor může vypadat nějak takhle:
1 2 3 4 5
6 6 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23
22 5 16 5 8 11

Pochopil sem že matici budu dělat dynamicky jak do šířky tak do délky, takže před samotným deklarováním matice si musím spočítat počet řádku a do nějakého pole budu ještě ukládat velikost každého řádku.Problém mám jak ty čísla dostat do té matice.

Nahlásit jako SPAM
IP: 85.92.58.–
cibule0
Návštěvník
30. 11. 2012   #3
-
0
-
Nahlásit jako SPAM
IP: 193.86.244.–
Durza
~ Anonymní uživatel
24 příspěvků
30. 11. 2012   #4
-
0
-

to se mi zdá divné
já si přece v tom souboru můžu zjistit počet řádků, teď udělám podle tohoto počtu jedno pole a do něj můžu zapisovat délky řádků. teď bych teoreticky mohl udělat matici vysokou jako počet řádků a širokou jako příslušná pozice v mojem poli délek řádků.
Jde to takhle?
Ja se to snažím naťukat ale sekl sem se , nejede mi to ani pro šířku rádku :( 

udělal sem zatím toto:

:( 

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

 // pro velikost pole
int c;

int PocetMnozin(void){ // kvuli vysce matice
    int pocetMnozin= 0;
    FILE *fr;
    while((c = getc(fr)) != EOF){ /* přečtení souboru,eof ej konstanta */
        if(c == '\n')
        pocetMnozin++;
    }
    return pocetMnozin;
}



int main(void){
    FILE *fr;
    if((fr = fopen("mnoziny.txt","r")) == NULL){    /* test ověření , null je absolutni nula kontanta*/
        printf("Soubor se nepodarilo otevrit.\n");
        system("pause");
        return 1;
    }

    printf("pocet mnoz %d",PocetMnozin());

    int *velikostiMnozin;    //jednorozmerne pole
    velikostiMnozin= (int*) malloc(PocetMnozin() *sizeof(int));

    int i=0;
    while((c = getc(fr)) != EOF){ /* přečtení souboru,eof ej konstanta */
        while(c != '/n'){
            if(c == ' ')
            velikostiMnozin[i]= +1;
        }
        i++;
    }
    for (i = 0; i < 5; i++){
    printf("%i, ", velikostiMnozin[i]);
}

/*
    while(!feof(fr)){
        while((c = getc(fr)) != '/n'){

        }
    fscanf(fr, "%f", &v[i++]);
*/

/*
    int **mnozinyPole;  //matice pro mnoziny
    mnozinyPole = (int **)malloc(PocetMnozin() * sizeof(int *));
    //od cyklu kvuli zapisu
    mnozinyPole[0] = (int *)malloc(3 * sizeof(int));
*/

  if (fclose(fr) == EOF){ /* test zavření */
     printf("Soubor se neporadilo zavrit.\n");
     return 1;
  }

  system("PAUSE");
  return 0;
}
Nahlásit jako SPAM
IP: 85.92.58.–
cibule0
Návštěvník
30. 11. 2012   #5
-
0
-

#4 Durza
Ja jsem to tam dal kvuli tomu ze nemusis zjistovat ty delky :-), a ten tvuj kod mas tam chyby:-)

Tak za prve v te funkci pocet mnozin mas ukazatel na ten soubor ale ten je nedefinovany, tudiž to spadne tak že ten soubor co otviras v main ho musis preda

int PocetMnozin(FILE * soubor);

PocetMnozin(fr); // volani funkce

a jak ctes po druhe soubor tak musis pozici v souboru umistit na zacatek, to se dela funkci rewind(FILE * soubor)

No a co se tyce toho zjistovani delek nvm, je to nejake divne :-) ten druhy cyklus souboru by melo byt velikostiMnozin[i]= +1; -> velikostiMnozin[i]= ++; a ten printf moc nechapu k cemu tam je :-)

Ono by to chtelo na studovat tu praci se soubory a pak ta funkce pocetmnozin tu tam volas dvakrat taky zbytecne, staci si to ulozit do promene a to pole velikostiMnozin[i] by melo byt nulovane tak radsi pouzit calloc misto malloc

Nahlásit jako SPAM
IP: 193.86.244.–
Durza
~ Anonymní uživatel
24 příspěvků
30. 11. 2012   #6
-
0
-

Tak sem s tím trochu pohnul , jen se mi to cyklí a není my jasné proč, ten vnitřní while přece narazí na \n ale i tak se neukončí

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

 // pro velikost pole
int c;
int pocetMnozin= 0;

int PocetMnozin(FILE * fr){ // kvuli vysce matice
    while((c = getc(fr)) != EOF){ 
        if(c == '\n')
        pocetMnozin++;
    }
}



int main(void){
    FILE *fr;
    if((fr = fopen("mnoziny.txt","r")) == NULL){    
        printf("Soubor se nepodarilo otevrit.\n");
        system("pause");
        return 1;
    }
    int i=0;
    PocetMnozin(fr);
    printf("pocet mnoz %d,\n",pocetMnozin);

    int *velikostiMnozin;    
    velikostiMnozin= (int*) calloc( pocetMnozin , sizeof(int));


    rewind(fr);
    while((c = getc(fr)) != EOF){ 
        while(c != '/n'){
            printf("zde se mi to mrcha cykli");
            if(c == ' '){
            printf("velikosti uvnitr %d",velikostiMnozin[i]);
            velikostiMnozin[i]++;
            }
        }
        i++;
    }

    for (i = 0; i < pocetMnozin; i++){  //vypis pole s velikostma (jen pro kontrolu
    printf("%i, ", velikostiMnozin[i]);
    }



  if (fclose(fr) == EOF){ /* test zavření */
     printf("Soubor se neporadilo zavrit.\n");
     return 1;
  }

  system("PAUSE");
  return 0;
}
Nahlásit jako SPAM
IP: 85.92.58.–
Durza
~ Anonymní uživatel
24 příspěvků
30. 11. 2012   #7
-
0
-

tak konečně sem si spočítal velikosti souboru 
 

    rewind(fr);
    while((c = getc(fr)) != EOF){ /* přečtení souboru,eof je konstanta */
        while((c =getc(fr)) != '\n'){
            if(c == ' ' ){ //mezer je vzdy o 1 min nez cisel , nekde pridat +1
            velikostiMnozin[i]++;
            }
        }
        velikostiMnozin[i]++; // tady si pridavam +1
        i++;
    }
Nahlásit jako SPAM
IP: 85.92.58.–
Durza
~ Anonymní uživatel
24 příspěvků
1. 12. 2012   #8
-
0
-

Tak se mi povedlo to sesmolit
Naplnění matice ze souboru když neznáme jeho velikost

třeba to někomu v budoucnu ulehčí práci

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

int c;
int pocetMnozin= 0;

int PocetMnozin(FILE * fr){ // kvuli poctu mnozin(radku) matice
    while((c = getc(fr)) != EOF){
        if(c == '\n')
        pocetMnozin++;
    }
}



int main(void){
    FILE *fr;
    if((fr = fopen("mnoziny.txt","r")) == NULL){    //test otevreni
        printf("Soubor se nepodarilo otevrit.\n");
        system("pause");
        return 1;
    }
    int i=0;
    PocetMnozin(fr);
    printf("pocet mnozin (radku) %d\n",pocetMnozin);

    int *velikostiMnozin;    //jednorozmerne pole
    velikostiMnozin= (int*) calloc( pocetMnozin , sizeof(int));


    rewind(fr);
    while((c = getc(fr)) != EOF){ /* přečtení souboru */
        while((c =getc(fr)) != '\n'){
            if(c == ' ' ){ //mezer je vzdy o 1 min nez cisel , nekde pridat +1
            velikostiMnozin[i]++;
            }
        }
        velikostiMnozin[i]++; // zde pridavam tu +1
        i++;
    }


    int **mnozinyPole;  //matice pro mnoziny
    mnozinyPole = (int **)calloc( pocetMnozin , sizeof(int *)); //zde si alokuju kolik ma mit matice radku

    int j = 0;
    rewind(fr);


    for(i= 0; i< pocetMnozin ; i++){     
        mnozinyPole[i] = (int *)calloc( velikostiMnozin[i] , sizeof(int));  //tady alokuju sloupecky kazdeho radku
        for(j=0; j<velikostiMnozin[i]; j++){
            fscanf(fr, "%d", &mnozinyPole[i][j]);   //tady matici plním
        }
    }


    printf("\n\n\n\n");
    
    for(i = 0; i < pocetMnozin ; i++){     //vypis finalni matice
        for (j = 0; j < velikostiMnozin[i]; j++)
            printf("%i ", mnozinyPole[i][j]);
        printf("\n");
    }



  if (fclose(fr) == EOF){ /* test zavření souboru*/
     printf("Soubor se neporadilo zavrit\n");
     return 1;
  }

  system("PAUSE");
  return 0;
}
Nahlásit jako SPAM
IP: 85.92.58.–
Durza
~ Anonymní uživatel
24 příspěvků
2. 12. 2012   #9
-
0
-

a když chci dát ten výpis matice jako funkci ... proc mi nejde tohle?

 program se zacyklí

void vypisMatice(){

    printf("\n\n\n\n");

    for(i = 0; i < pocetMnozin ; i++){     //vypis finalni matice
        for (j = 0; j < velikostiMnozin[i]; j++)
            printf("%i ", mnozinyPole[i][j]);
        printf("\n");
    }
}
Nahlásit jako SPAM
IP: 85.92.58.–
cibule0
Návštěvník
2. 12. 2012   #10
-
0
-

#9 Durza
No veliksotMnozin a mnozinyPole mas jako lokalni promenou, bud to dej jako globalni promene, nebo to predavej jako parametr te funkce vypis

Nahlásit jako SPAM
IP: 85.70.207.–
Durza
~ Anonymní uživatel
24 příspěvků
2. 12. 2012   #11
-
0
-

#10 cibule
zapomněl sem říct že sem to jako global dal
ale díky tvemu upozornění sem si uvedomil že to nemůžu mět zarověň jako global a zaroveň to předávat parametrem :D

už sem to rozchodil, diky

Nahlásit jako SPAM
IP: 85.92.58.–
Sprinter
~ Anonymní uživatel
102 příspěvků
7. 1. 2013   #12
-
0
-

Potřebuji také, aby se mi vastupní data ze souboru načetla do matice. Vypůjčil jsem si proto zdrojoý kód výše, ale nefunguje - dojde k zacyklení. Přišel jsem na to, že je problém v tomoto úseku kódu:

 rewind(fr);
    while((c = getc(fr)) != EOF){ /* přečtení souboru */
        while((c =getc(fr)) != '\n'){
            if(c == ' ' ){ //mezer je vzdy o 1 min nez cisel , nekde pridat +1
            velikostiMnozin[i]++;
            }
        }
        velikostiMnozin[i]++; // zde pridavam tu +1
        i++;
    }

ale nevidim, proč to nefunguje. Nevěděli byste?

Nahlásit jako SPAM
IP: 147.228.209.–
Sprinter
~ Anonymní uživatel
102 příspěvků
7. 1. 2013   #13
-
0
-

Chápu, že první while jede dokud nenarazí na konec souboru. Ten druhý dokud nenarazí na konec řádky. A právě v tom druhém while se to zacyklí.. neni problém operačního systému? Jestli se to třeba pod Win nechová jinak, než pod Linuxem (myslim, že to řádkování je trochu odlišné)

Nahlásit jako SPAM
IP: 147.228.209.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 58 hostů

Podobná vlákna

Matice z textového souboru ? — založil Robin93

Načtení souboru C — založil jindra1995

Načtení souboru? — založil DjHard

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý