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.
Fórum › C / C++
Načtení matice ze souboru
![](img/forum_vlakno_help_vyreseno.png)
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.
#2 Durza
Dynamicka matice se řešila tady
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;
}
#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
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;
}
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++;
}
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;
}
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");
}
}
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?
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é)
![](img/forum_nove_psp_new.png)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Načtení znaků ze souboru do matice — založil Sprinter
Načtení souboru a zápis do souboru — založil pazdy
Matice z textového souboru ? — založil Robin93
Načtení souboru C — založil jindra1995
C++ načtení ze souboru — založil james2000
Moderátoři diskuze