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 | 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 | 3 |
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 | 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 | 3 |
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 | 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 | 3 |
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 | 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 |
---|
| v Assembler, C, C++, Pascal, Java | 4 | 2407 | 05.07.2011 14:53 v.tkac | | v Assembler, C, C++, Pascal, Java | 5 | 2187 | 28.04.2011 10:39 Fico | | v Assembler, C, C++, Pascal, Java | 8 | 915 | 14.11.2013 15:57 erik518 | | v Assembler, C, C++, Pascal, Java | 5 | 631 | 23.08.2014 21:35 nasm | | v PHP, ASP | 12 | 815 | 28.02.2008 20:58 Tominator | | v Databázy | 6 | 661 | 15.08.2012 19:13 zdeniatqo | | v PHP, ASP | 4 | 1073 | 13.02.2009 17:55 _fortes_ | | v Assembler, C, C++, Pascal, Java | 3 | 731 | 25.11.2010 15:00 ado21 | | v JavaScript, VBScript, Ajax | 9 | 1138 | 05.03.2008 13:45 stenley | | v HTML, XHTML, XML, CSS | 11 | 2467 | 23.02.2020 21:58 JanoF | | v Redakčné systémy | 9 | 13658 | 20.03.2014 7:23 don jebot | | v PHP, ASP | 2 | 722 | 11.12.2009 18:22 d0.0b | | v Databázy | 8 | 1503 | 31.10.2008 20:08 El_locco | | v Assembler, C, C++, Pascal, Java | 0 | 451 | 15.04.2020 22:32 michaleres | | v Assembler, C, C++, Pascal, Java | 6 | 960 | 10.01.2010 10:24 ado21 | | v Assembler, C, C++, Pascal, Java | 1 | 616 | 12.08.2012 23:18 nBXXL |
|