Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 7 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 02.06.13
Prihlásený: 07.06.16
Príspevky: 63
Témy: 18
Príspevok NapísalOffline : 30.03.2015 15: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


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 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!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 02.06.13
Prihlásený: 07.06.16
Príspevky: 63
Témy: 18
Príspevok Napísal autor témyOffline : 31.03.2015 13:52

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


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 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!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 02.06.13
Prihlásený: 07.06.16
Príspevky: 63
Témy: 18
Príspevok Napísal autor témyOffline : 31.03.2015 17:00

na tu som zabudol ale nepomohla,
neviem ci tam nedat ine porovnavanie nejake cez
for(i=0;i != '\0';i++) ci ?


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 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!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 02.06.13
Prihlásený: 07.06.16
Príspevky: 63
Témy: 18
Príspevok Napísal autor témyOffline : 31.03.2015 17:47

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.


Odpovedať na tému [ Príspevkov: 7 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. nacitanie obsahu suboru do pola v C

v Assembler, C, C++, Pascal, Java

5

2047

28.04.2011 10:39

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. efektivne nacitanie suboru do pamati v c

v Assembler, C, C++, Pascal, Java

4

2248

05.07.2011 14:53

v.tkac Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. [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 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nacitanie suboru

v Assembler, C, C++, Pascal, Java

5

488

23.08.2014 21:35

nasm Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nacitanie CSS suboru

v PHP, ASP

12

672

28.02.2008 20:58

Tominator Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. postgresql nacitanie suboru

v Databázy

6

505

15.08.2012 19:13

zdeniatqo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nacitanie obsahu suboru

v PHP, ASP

4

925

13.02.2009 17:55

_fortes_ Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nacitanie suboru s adresaru

v Assembler, C, C++, Pascal, Java

3

604

25.11.2010 15:00

ado21 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nacitanie obsahu suboru do premennej

v JavaScript, VBScript, Ajax

9

1003

05.03.2008 13:45

stenley Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Načítanie kódu HTML z iného súboru

v HTML, XHTML, XML, CSS

11

1746

23.02.2020 21:58

JanoF Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Načítanie php súboru len pre jednu špecifickú url ...

v PHP, ASP

2

587

11.12.2009 18:22

d0.0b Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nacitanie dat z unl/txt suboru do oracle

v Databázy

8

1378

31.10.2008 20:08

El_locco Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. wordpress plugin - nacitanie php suboru +include css suborov

v Redakčné systémy

9

1361

20.03.2014 7:23

don jebot Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C++ vyvolanie funkcie

v Assembler, C, C++, Pascal, Java

0

383

15.04.2020 22:32

michaleres Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C++ nacitanie

v Assembler, C, C++, Pascal, Java

6

912

10.01.2010 10:24

ado21 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C (FILE ako parameter funkcie)

v Assembler, C, C++, Pascal, Java

1

623

29.10.2009 11:16

benji0o Zobrazenie posledných príspevkov


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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra