| | |
| Stránka: 1 z 1
| [ Príspevkov: 7 ] | |
Autor | Správa |
---|
Registrovaný: 02.06.13 Prihlásený: 07.06.16 Príspevky: 63 Témy: 18 |
PROGRAM Kód: #include <stdio.h> #include <stdlib.h> #include <string.h>
int funkcia_v(FILE *fr); void funkcia_d(FILE **fr); void funkcia_n(FILE *fr,int ulice);
int funkcia_v(FILE *fr) { int datum,pocet = 0; double dan; char c,meno[50],ulica[50]; /*Osetrenie otvorenia suboru*/ if((fr = fopen("dan.txt","r")) == NULL) { printf("Neotvoreny subor\n");exit(1); } /*Nacitanie zaznamov zo suboru*/ while((c=fgetc(fr)) != EOF) { ungetc(c,fr);//vrati prvy znak fgets(meno,50,fr);//nacita prvy riadok do stringu fgets(ulica,50,fr);//nacita druhy riadok do stringu fscanf(fr,"%lf\n",&dan);//nacita 3 riadok do doublu fscanf(fr,"%d\n",&datum);//nacita 4 riadok do int pocet++; //pocet zaznamov tym aj pocet ulic printf("priezvisko meno: %s",meno);//vypis printf("ulica cislo: %s",ulica); printf("dan: %.2lf\n",dan); printf("datum: %d\n",datum); putchar('\n'); } rewind(fr);//nastavy subor na zaciatok /*Osetrene uzavretie suboru*/ if((fclose(fr)) == EOF) { printf("Neuzavrety subor\n");exit(1); } /*Vrati pocet zaznamov*/ return pocet; } void funkcia_d(FILE **fr) { int datum,ret; double dan,max=0; char c,meno[50],ulica[50],max_ulica[50];
gets(max_ulica); //scanf("%[^\n]s",max_ulica); //fgets(fr,50,stdin); //printf("%s\n",max_ulica); if((fr = fopen("dan.txt","r")) == NULL) { printf("Neotvoreny subor\n");exit(1); } while((c=fgetc(fr)) != EOF) { ungetc(c,fr); fgets(meno,50,fr); fgets(ulica,50,fr); //fscanf(fr,"%s",ulica); ret = strcmp(max_ulica,ulica);//porovna nacitanu ulicu zo vstupu s ulicou v subore if(ret == 0) { fscanf(fr,"%lf\n",&dan); if(dan > max)//zisti najvaciu dan z ulice max = dan; fscanf(fr,"%d\n",&datum); } else { fscanf(fr,"%lf\n",&dan); fscanf(fr,"%d\n",&datum); } } printf("%.2lf\n",max); } void funkcia_n(FILE *fr,int ulice) { int i,riadky,stlpce; char **pole;
pole = (char**)malloc(ulice*sizeof(char*)); for(i=0;i<ulice;i++) { pole[i] = (char*)malloc(ulice*sizeof(char)); }
}
int main() { int p = 1,pocet_zaznamov; char volba; FILE *fr = NULL; while(p) { volba = getchar(); if(volba == 'k') p = 0; switch(volba) { case 'v' : pocet_zaznamov = funkcia_v(fr);break; case 'd' : funkcia_d(&fr);break; case 'n' : funkcia_n(fr,pocet_zaznamov);break; } } return 0; } Problem je ze ked dam funkciu v na vypis tak vypise tak ako ma no ked dam funkciu d tak mi to nechce nacitat neviete kde tam je chyba ?,, nejak mi nechce podmienku zbehnut ,,,, strcmp vo funkcii d
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 31.03.2015 10:50 | |
|
Chyby sú tam dve: 1. Funkcia gets(max_ulica) nenačíta žiadnu ulicu, načíta len znak nového riadku '\n', ktorý si zadal na štandardný vstup vo chvíli, keď si stlačil Enter (teda potvrdil možnosť d). Riešením je "vypláchnuť" štandardný vstup tesne pred načítaním ulice - na to slúži funkcia Kód: fflush(stdin); 2. fgets načíta aj znak nového riadku '\n'. Po zavolaní fgets(ulica,50,fr); je v premennej ulica niečo takéto Kód: Zeleného 42\n zatiaľ čo v max_ulica je (po načítaní s gets) reťazec bez \n na konci. Riešením je napríklad zbaviť sa posledného znaku, ak sa rovná \n (mal by, ale pre istotu to skontrolujme) Kód: fgets(ulica,50,fr); if( ulica[strlen(ulica)-1] == '\n' ) ulica[strlen(ulica)-1] = '\0'; A ešte jedna vec, tu Kód: void funkcia_d(FILE **fr) máš z akého dôvodu dve hviezdičky?
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 02.06.13 Prihlásený: 07.06.16 Príspevky: 63 Témy: 18 |
MAIN Kód: int main() { int p = 1,pocet_zaznamov; char volba,ulica[50]; FILE *fr = NULL; while(p) { volba = getchar(); if(volba == 'k') p = 0; switch(volba) { case 'n' : funkcia_n(fr,pocet_zaznamov);break; case 'v' : funkcia_v(fr);break; case 'd' : fflush(stdin);//nacita \n fgets(ulica,50,stdin);//nacita ulicu zo vstupu funkcia_d(fr,ulica);break; } } return 0; } funkcia_d Kód: void funkcia_d(FILE *fr,char *max_ulica) { int datum; double dan,max=0; char c,meno[50],ulica[50];
if((fr = fopen("dan.txt","r")) == NULL) { printf("Neotvoreny subor\n");exit(1); } while((c=fgetc(fr)) != EOF) { ungetc(c,fr); fgets(meno,50,fr);printf("meno-%s",meno);//neviem ci aj tu pouzit fflush ? fgets(ulica,50,fr);printf("ulica-%s",ulica); if((strcmp(ulica,max_ulica)) == 0) { fscanf(fr,"%lf\n",&dan);printf("if-dan-%.2lf\n",dan); if(dan > max) { max = dan;printf("max-%.2lf"); } fscanf(fr,"%d\n",&datum);printf("if-datum-%d\n",datum); } else { fscanf(fr,"%lf\n",&dan);printf("else-dan-%.2lf\n",dan); fscanf(fr,"%d\n",&datum);printf("else-datum-%d\n",datum); } } printf("%.2lf\n",max);//vypisanie maximalnej dane
rewind(fr);//nastavy subor na zaciatok
/*Osetrene uzavretie suboru*/ if((fclose(fr)) == EOF) { printf("Neuzavrety subor\n");exit(1); } } ukazka vstupneho suboru Mak Jozef Pavla Horova 35 752.22 13022014 Van Gogh Vincent Na Holom vrchu 35555/1205783 5886.45 31122014 Van Damme Jean Claude Pavla Horova 690/20 9211.10 15062012 Mudra Hilda Alstrova 337 534.77 22022014
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 31.03.2015 16:42 | |
|
fflush len vyčistí štandardný vstup - tj. po fflush(stdin) vstup neobsahuje vôbec nič, čiže ani žiadne ostatky, ktoré by tam mohol zanechať napríklad Enter. Pri načítavaní zo štandardného vstupu je dobré buď načítať skutočne všetko (včetne znaku Enter), alebo vždy pred načítaním zavolať fflush(stdin). Tá funkcia s otvoreným súborom nemá nič, použiješ ju len pred načítaním z užívateľského(štandardného) vstupu.
Ešte tam nevidím to odseknutie \n z konca načítaného riadku v súbore.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 02.06.13 Prihlásený: 07.06.16 Príspevky: 63 Témy: 18 |
na tu som zabudol ale nepomohla, neviem ci tam nedat ine porovnavanie nejake cez for(i=0;i != '\0';i++) ci ?
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 31.03.2015 17:18 | |
|
Takto by ti to malo fungovať Kód: void funkcia_d(FILE *fr) { int datum,ret; double dan,max=0; char c,meno[50],ulica[50],max_ulica[50];
fflush(stdin); //TOTO SOM PRIDAL gets(max_ulica);
if((fr = fopen("file.txt","r")) == NULL) { printf("Neotvoreny subor\n");exit(1); }
while((c=fgetc(fr)) != EOF) { ungetc(c,fr); fgets(meno,50,fr); fgets(ulica,50,fr); if( ulica[strlen(ulica)-1] == '\n' ) //TOTO SOM ulica[strlen(ulica)-1] = '\0'; // PRIDAL
printf("'%s' vs '%s' \n",ulica, max_ulica); // Tu si vypisem, co vlastne porovnavam ret = strcmp(max_ulica,ulica); //porovna nacitanu ulicu zo vstupu s ulicou v subore printf("ret == %d", ret); if(ret == 0) { fscanf(fr,"%lf\n",&dan); if(dan > max)//zisti najvaciu dan z ulice max = dan; fscanf(fr,"%d\n",&datum); } else { fscanf(fr,"%lf\n",&dan); fscanf(fr,"%d\n",&datum); max = 1; } } printf("%.2lf\n",max); }
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 02.06.13 Prihlásený: 07.06.16 Príspevky: 63 Témy: 18 |
vdaka ten pomocny vypis vs pomohol,, if(ulica[strlen(ulica)-1] == '\n' ) ulica[strlen(ulica)-2] = '\0'; -2 lebo posledna bola medzera v subore, alebo upravenim suboru aby neboli medzeri na konci v riadku.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 7 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| nacitanie obsahu suboru do pola v C v Assembler, C, C++, Pascal, Java | 5 | 2047 | 28.04.2011 10:39 Fico | | efektivne nacitanie suboru do pamati v c v Assembler, C, C++, Pascal, Java | 4 | 2248 | 05.07.2011 14:53 v.tkac | | [C# - Help] Načítanie + vypísanie so súboru text do textbox v Assembler, C, C++, Pascal, Java | 8 | 771 | 14.11.2013 15:57 erik518 | | Nacitanie suboru v Assembler, C, C++, Pascal, Java | 5 | 488 | 23.08.2014 21:35 nasm | | Nacitanie CSS suboru v PHP, ASP | 12 | 672 | 28.02.2008 20:58 Tominator | | postgresql nacitanie suboru v Databázy | 6 | 505 | 15.08.2012 19:13 zdeniatqo | | nacitanie obsahu suboru v PHP, ASP | 4 | 925 | 13.02.2009 17:55 _fortes_ | | nacitanie suboru s adresaru v Assembler, C, C++, Pascal, Java | 3 | 604 | 25.11.2010 15:00 ado21 | | nacitanie obsahu suboru do premennej v JavaScript, VBScript, Ajax | 9 | 1003 | 05.03.2008 13:45 stenley | | Načítanie kódu HTML z iného súboru v HTML, XHTML, XML, CSS | 11 | 1746 | 23.02.2020 21:58 JanoF | | Načítanie php súboru len pre jednu špecifickú url ... v PHP, ASP | 2 | 587 | 11.12.2009 18:22 d0.0b | | Nacitanie dat z unl/txt suboru do oracle v Databázy | 8 | 1378 | 31.10.2008 20:08 El_locco | | wordpress plugin - nacitanie php suboru +include css suborov v Redakčné systémy | 9 | 1361 | 20.03.2014 7:23 don jebot | | C++ vyvolanie funkcie v Assembler, C, C++, Pascal, Java | 0 | 383 | 15.04.2020 22:32 michaleres | | C++ nacitanie v Assembler, C, C++, Pascal, Java | 6 | 912 | 10.01.2010 10:24 ado21 | | C (FILE ako parameter funkcie) v Assembler, C, C++, Pascal, Java | 1 | 623 | 29.10.2009 11:16 benji0o |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|