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
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é)
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
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
Načtení souboru? — založil DjHard
Moderátoři diskuze